library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(ggplot2)
library(mgcv)
## Loading required package: nlme
## 
## Attaching package: 'nlme'
## The following object is masked from 'package:dplyr':
## 
##     collapse
## This is mgcv 1.8-31. For overview type 'help("mgcv-package")'.
library(broom)
library(splines)
library(purrr)
### define the fine spatial grids for each GP, the spatial resolution
### will be between -2 and 2 for all dimensions for simplicity
num_fine_int <- 40

fine_grid_list <- list(
  x1 = seq(-2, 2, length.out = num_fine_int+1),
  x2 = seq(-2, 2, length.out = num_fine_int+1)
)
fine_grid_list
## $x1
##  [1] -2.0 -1.9 -1.8 -1.7 -1.6 -1.5 -1.4 -1.3 -1.2 -1.1 -1.0 -0.9 -0.8 -0.7 -0.6
## [16] -0.5 -0.4 -0.3 -0.2 -0.1  0.0  0.1  0.2  0.3  0.4  0.5  0.6  0.7  0.8  0.9
## [31]  1.0  1.1  1.2  1.3  1.4  1.5  1.6  1.7  1.8  1.9  2.0
## 
## $x2
##  [1] -2.0 -1.9 -1.8 -1.7 -1.6 -1.5 -1.4 -1.3 -1.2 -1.1 -1.0 -0.9 -0.8 -0.7 -0.6
## [16] -0.5 -0.4 -0.3 -0.2 -0.1  0.0  0.1  0.2  0.3  0.4  0.5  0.6  0.7  0.8  0.9
## [31]  1.0  1.1  1.2  1.3  1.4  1.5  1.6  1.7  1.8  1.9  2.0
### set the true relationships per factor

### set the functional expressions

true_functions <- list(
  g1 = function(x, av){av$a0 + av$a1 * cos(av$a2 * pi * x)},
  g2 = function(x, av){av$a0 + av$a1 * cos(av$a2 * pi * x)}
)

### set the parameters of the functions
true_hypers <- list(
  g1 = list(a0 = 0, a1 = 1, a2 = 1),
  g2 = list(a0 = 0, a1 = 1, a2 = 1)
)
### define a wrapper function for executing the functions
run_factors <- function(myfunc, myx, myparams)
{
  myfunc(myx, myparams)
}
### calculate each of the factors over the fine grid
fine_true_factors <- purrr::pmap(list(true_functions,
                                      fine_grid_list,
                                      true_hypers),
                                 run_factors)

fine_true_factors
## $g1
##  [1]  1.000000e+00  9.510565e-01  8.090170e-01  5.877853e-01  3.090170e-01
##  [6] -1.836970e-16 -3.090170e-01 -5.877853e-01 -8.090170e-01 -9.510565e-01
## [11] -1.000000e+00 -9.510565e-01 -8.090170e-01 -5.877853e-01 -3.090170e-01
## [16]  6.123234e-17  3.090170e-01  5.877853e-01  8.090170e-01  9.510565e-01
## [21]  1.000000e+00  9.510565e-01  8.090170e-01  5.877853e-01  3.090170e-01
## [26]  6.123234e-17 -3.090170e-01 -5.877853e-01 -8.090170e-01 -9.510565e-01
## [31] -1.000000e+00 -9.510565e-01 -8.090170e-01 -5.877853e-01 -3.090170e-01
## [36] -1.836970e-16  3.090170e-01  5.877853e-01  8.090170e-01  9.510565e-01
## [41]  1.000000e+00
## 
## $g2
##  [1]  1.000000e+00  9.510565e-01  8.090170e-01  5.877853e-01  3.090170e-01
##  [6] -1.836970e-16 -3.090170e-01 -5.877853e-01 -8.090170e-01 -9.510565e-01
## [11] -1.000000e+00 -9.510565e-01 -8.090170e-01 -5.877853e-01 -3.090170e-01
## [16]  6.123234e-17  3.090170e-01  5.877853e-01  8.090170e-01  9.510565e-01
## [21]  1.000000e+00  9.510565e-01  8.090170e-01  5.877853e-01  3.090170e-01
## [26]  6.123234e-17 -3.090170e-01 -5.877853e-01 -8.090170e-01 -9.510565e-01
## [31] -1.000000e+00 -9.510565e-01 -8.090170e-01 -5.877853e-01 -3.090170e-01
## [36] -1.836970e-16  3.090170e-01  5.877853e-01  8.090170e-01  9.510565e-01
## [41]  1.000000e+00
fine_true_latent_dfs <- purrr::pmap(list(fine_grid_list,
                                         fine_true_factors,
                                         1:2),
                                    function(x, g, glabel){tibble::tibble(x = x, g = g) %>% 
                                        purrr::set_names(c(sprintf("x%d", glabel),
                                                           sprintf("g%d", glabel))) %>% 
                                        tibble::rowid_to_column(sprintf("x%d_id", glabel))})

fine_true_latent_dfs
## $x1
## # A tibble: 41 x 3
##    x1_id    x1        g1
##    <int> <dbl>     <dbl>
##  1     1 -2     1.00e+ 0
##  2     2 -1.9   9.51e- 1
##  3     3 -1.8   8.09e- 1
##  4     4 -1.7   5.88e- 1
##  5     5 -1.6   3.09e- 1
##  6     6 -1.5  -1.84e-16
##  7     7 -1.4  -3.09e- 1
##  8     8 -1.30 -5.88e- 1
##  9     9 -1.2  -8.09e- 1
## 10    10 -1.1  -9.51e- 1
## # … with 31 more rows
## 
## $x2
## # A tibble: 41 x 3
##    x2_id    x2        g2
##    <int> <dbl>     <dbl>
##  1     1 -2     1.00e+ 0
##  2     2 -1.9   9.51e- 1
##  3     3 -1.8   8.09e- 1
##  4     4 -1.7   5.88e- 1
##  5     5 -1.6   3.09e- 1
##  6     6 -1.5  -1.84e-16
##  7     7 -1.4  -3.09e- 1
##  8     8 -1.30 -5.88e- 1
##  9     9 -1.2  -8.09e- 1
## 10    10 -1.1  -9.51e- 1
## # … with 31 more rows
### create the tensor product of the two factors
fine_latent_tensor <- expand.grid(fine_grid_list,
            KEEP.OUT.ATTRS = FALSE,
            stringsAsFactors = FALSE) %>% 
  as.data.frame() %>% tbl_df() %>% 
  left_join(fine_true_latent_dfs[[1]], by = "x1") %>% 
  left_join(fine_true_latent_dfs[[2]], by = "x2") %>% 
  select(ends_with("_id"), x1:x2, g1, g2) %>% 
  tibble::rowid_to_column("fine_id")
## Warning: `tbl_df()` is deprecated as of dplyr 1.0.0.
## Please use `tibble::as_tibble()` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_warnings()` to see where this warning was generated.
fine_latent_tensor
## # A tibble: 1,681 x 7
##    fine_id x1_id x2_id    x1    x2        g1    g2
##      <int> <int> <int> <dbl> <dbl>     <dbl> <dbl>
##  1       1     1     1 -2       -2  1.00e+ 0     1
##  2       2     2     1 -1.9     -2  9.51e- 1     1
##  3       3     3     1 -1.8     -2  8.09e- 1     1
##  4       4     4     1 -1.7     -2  5.88e- 1     1
##  5       5     5     1 -1.6     -2  3.09e- 1     1
##  6       6     6     1 -1.5     -2 -1.84e-16     1
##  7       7     7     1 -1.4     -2 -3.09e- 1     1
##  8       8     8     1 -1.30    -2 -5.88e- 1     1
##  9       9     9     1 -1.2     -2 -8.09e- 1     1
## 10      10    10     1 -1.1     -2 -9.51e- 1     1
## # … with 1,671 more rows
### visualize the product of the two factors
fine_latent_tensor %>% 
  count(x1, x2, g1, g2) %>% 
  ggplot(mapping = aes(x = x1, y = x2)) +
  geom_raster(mapping = aes(fill = g1 * g2)) +
  coord_equal() +
  scale_fill_viridis_b() +
  theme_bw()

### visualize the sum of the all 2 factors
fine_latent_tensor %>% 
  mutate(go = g1 * g2) %>% 
  ggplot(mapping = aes(x = x1, y = go)) +
  geom_line() +
  facet_wrap(~x2, labeller = "label_both") +
  theme_bw() +
  theme(axis.text = element_blank())

### generate the noisy observations
sd_noise <- 0.1 # noise

set.seed(813123)
fine_df <- fine_latent_tensor %>% 
  mutate(go = g1 * g2,
         y = rnorm(n = n(), mean = go, sd = sd_noise))

fine_df
## # A tibble: 1,681 x 9
##    fine_id x1_id x2_id    x1    x2        g1    g2        go       y
##      <int> <int> <int> <dbl> <dbl>     <dbl> <dbl>     <dbl>   <dbl>
##  1       1     1     1 -2       -2  1.00e+ 0     1  1.00e+ 0  0.994 
##  2       2     2     1 -1.9     -2  9.51e- 1     1  9.51e- 1  1.07  
##  3       3     3     1 -1.8     -2  8.09e- 1     1  8.09e- 1  1.03  
##  4       4     4     1 -1.7     -2  5.88e- 1     1  5.88e- 1  0.640 
##  5       5     5     1 -1.6     -2  3.09e- 1     1  3.09e- 1  0.369 
##  6       6     6     1 -1.5     -2 -1.84e-16     1 -1.84e-16 -0.0872
##  7       7     7     1 -1.4     -2 -3.09e- 1     1 -3.09e- 1 -0.436 
##  8       8     8     1 -1.30    -2 -5.88e- 1     1 -5.88e- 1 -0.348 
##  9       9     9     1 -1.2     -2 -8.09e- 1     1 -8.09e- 1 -0.917 
## 10      10    10     1 -1.1     -2 -9.51e- 1     1 -9.51e- 1 -1.09  
## # … with 1,671 more rows
### look at the fine grid noisy data in log space
fine_df %>% 
  ggplot(mapping = aes(x = x1, y = y)) +
  geom_point() +
  facet_wrap(~x2, labeller = "label_both") +
  theme_bw() +
  theme(axis.text = element_blank())

fine_df %>% 
  ggplot(mapping = aes(x = x1, y = x2)) +
  geom_raster(mapping = aes(fill = y)) +
  coord_equal() +
  scale_fill_viridis_b() +
  theme_bw()

### work with a coarse grid instead of all of the points in the fine grid
num_coarse_int <- 20

coarse_grid_list <- list(
  x1 = seq(-2, 2, length.out = num_coarse_int+1),
  x2 = seq(-2, 2, length.out = num_coarse_int+1)
)
coarse_grid_list
## $x1
##  [1] -2.0 -1.8 -1.6 -1.4 -1.2 -1.0 -0.8 -0.6 -0.4 -0.2  0.0  0.2  0.4  0.6  0.8
## [16]  1.0  1.2  1.4  1.6  1.8  2.0
## 
## $x2
##  [1] -2.0 -1.8 -1.6 -1.4 -1.2 -1.0 -0.8 -0.6 -0.4 -0.2  0.0  0.2  0.4  0.6  0.8
## [16]  1.0  1.2  1.4  1.6  1.8  2.0
coarse_grid <- expand.grid(coarse_grid_list,
                           KEEP.OUT.ATTRS = FALSE,
                           stringsAsFactors = FALSE) %>% 
  as.data.frame() %>% tbl_df()
coarse_grid
## # A tibble: 441 x 2
##        x1    x2
##     <dbl> <dbl>
##  1 -2        -2
##  2 -1.8      -2
##  3 -1.6      -2
##  4 -1.4      -2
##  5 -1.2      -2
##  6 -1        -2
##  7 -0.800    -2
##  8 -0.600    -2
##  9 -0.400    -2
## 10 -0.200    -2
## # … with 431 more rows
train_df <- fine_df %>% 
  right_join(coarse_grid, by = c("x1", "x2"))

train_df
## # A tibble: 441 x 9
##    fine_id x1_id x2_id     x1    x2     g1    g2     go       y
##      <int> <int> <int>  <dbl> <dbl>  <dbl> <dbl>  <dbl>   <dbl>
##  1       1     1     1 -2        -2  1         1  1      0.994 
##  2       3     3     1 -1.8      -2  0.809     1  0.809  1.03  
##  3       5     5     1 -1.6      -2  0.309     1  0.309  0.369 
##  4       7     7     1 -1.4      -2 -0.309     1 -0.309 -0.436 
##  5       9     9     1 -1.2      -2 -0.809     1 -0.809 -0.917 
##  6      11    11     1 -1        -2 -1         1 -1     -1.18  
##  7      13    13     1 -0.800    -2 -0.809     1 -0.809 -0.778 
##  8      15    15     1 -0.600    -2 -0.309     1 -0.309 -0.271 
##  9      17    17     1 -0.400    -2  0.309     1  0.309  0.0613
## 10      19    19     1 -0.200    -2  0.809     1  0.809  0.694 
## # … with 431 more rows
### look at the true latent function in the log-space with respect to x2
train_df %>% 
  ggplot(mapping = aes(x = x1, y = go)) +
  geom_line() +
  geom_point(mapping = aes(y = y), color = "red") +
  facet_wrap(~ x2, labeller = "label_both") +
  theme_bw() +
  theme(axis.text = element_blank())

train_df %>% 
  ggplot(mapping = aes(x = x1, y = x2)) +
  geom_raster(mapping = aes(fill = y)) +
  coord_equal() +
  scale_fill_viridis_b() +
  theme_bw()

The original fit stats

Interact_cosine_model <- lm(y ~ g1:g2, data = train_df)
Interact_cosine_model %>% glance()
## # A tibble: 1 x 12
##   r.squared adj.r.squared  sigma statistic p.value    df logLik   AIC   BIC
##       <dbl>         <dbl>  <dbl>     <dbl>   <dbl> <dbl>  <dbl> <dbl> <dbl>
## 1     0.966         0.966 0.0987    12661.       0     1   397. -787. -775.
## # … with 3 more variables: deviance <dbl>, df.residual <int>, nobs <int>

extracting basis functions from GAM’s smooths

Fitting extracted basis of SmoothCon using lm()

model_gam_basis_linear_fit_func_interact <- function(df_1, df_2, data){
  model <- lm(y ~ smoothCon(ti(x1, x2, k=c(df_1,df_2)), data = data)[[1]]$X, data = data)
  metrics <- glance(model) %>% mutate(df_1 = df_1, df_2 = df_2)
  return(metrics)
}
df_grid_interact<- expand.grid(x1 = 5:17, x2 = 5:17, KEEP.OUT.ATTRS = FALSE) %>% as.data.frame() %>% tbl_df()
df_grid_interact
## # A tibble: 169 x 2
##       x1    x2
##    <int> <int>
##  1     5     5
##  2     6     5
##  3     7     5
##  4     8     5
##  5     9     5
##  6    10     5
##  7    11     5
##  8    12     5
##  9    13     5
## 10    14     5
## # … with 159 more rows
model_comp_gam_basis_interact <- map2_dfr(df_grid_interact$x1, df_grid_interact$x2, model_gam_basis_linear_fit_func_interact, data = train_df)
model_comp_gam_basis_interact %>% arrange(AIC) %>% mutate(AIC_rank = 1:n()) %>%
  ggplot(mapping = aes(x = as.factor(df_1), y= as.factor(df_2))) +
  geom_tile(mapping = aes(fill = AIC)) +
  geom_text(mapping = aes(label = AIC_rank), color = "white") 

model_comp_gam_basis_interact %>% arrange(BIC) %>% mutate(BIC_rank = 1:n()) %>%
  ggplot(mapping = aes(x = as.factor(df_1), y= as.factor(df_2))) +
  geom_tile(mapping = aes(fill = BIC)) +
  geom_text(mapping = aes(label = BIC_rank), color = "white") 

# best model based on AIC fit

df_best_gam_basis_interact_AIC <- model_comp_gam_basis_interact%>% filter(AIC == min(AIC)) %>% select(df_1, df_2)
df_best_gam_basis_interact_AIC
## # A tibble: 1 x 2
##    df_1  df_2
##   <int> <int>
## 1    10    12
sm_interact_ti_AIC = smoothCon(ti(x1, x2, k=c(df_best_gam_basis_interact_AIC$df_1,df_best_gam_basis_interact_AIC$df_2)), data = train_df)[[1]]
#sm_full_ti$X
sm_interact_ti_AIC$X %>% as.data.frame() %>% tbl_df() %>% 
  tibble::rowid_to_column() %>% 
  left_join(coarse_grid %>% tibble::rowid_to_column(),
            by = "rowid") %>%
  tidyr::gather(key = "key", value = "value", -rowid, -x1, -x2) %>%
  mutate(id = factor(key, levels = as.vector(unique(key)))) %>%
  ggplot(mapping = aes(x = x1, y = x2)) +
  geom_raster(mapping = aes(fill = value)) +
  facet_wrap(~ id, labeller = "label_both") +
  scale_fill_viridis_b() +
  theme_bw()

gam_basis_linear_fit_AIC <- lm(y ~ sm_interact_ti_AIC$X, data = train_df)
gam_basis_linear_fit_AIC %>% summary()
## 
## Call:
## lm(formula = y ~ sm_interact_ti_AIC$X, data = train_df)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.259053 -0.069192  0.001646  0.072067  0.295470 
## 
## Coefficients:
##                         Estimate Std. Error t value Pr(>|t|)    
## (Intercept)             0.003359   0.005378   0.624 0.532747    
## sm_interact_ti_AIC$X1   0.042500   0.076918   0.553 0.580946    
## sm_interact_ti_AIC$X2   0.070537   0.072716   0.970 0.332714    
## sm_interact_ti_AIC$X3   0.088326   0.076345   1.157 0.248109    
## sm_interact_ti_AIC$X4   0.082429   0.074662   1.104 0.270359    
## sm_interact_ti_AIC$X5  -0.079722   0.075137  -1.061 0.289428    
## sm_interact_ti_AIC$X6  -0.075011   0.074718  -1.004 0.316128    
## sm_interact_ti_AIC$X7   0.061323   0.075262   0.815 0.415759    
## sm_interact_ti_AIC$X8   0.121801   0.075329   1.617 0.106821    
## sm_interact_ti_AIC$X9   0.143949   0.074504   1.932 0.054177 .  
## sm_interact_ti_AIC$X10 -0.170242   0.073307  -2.322 0.020804 *  
## sm_interact_ti_AIC$X11 -0.164808   0.086454  -1.906 0.057451 .  
## sm_interact_ti_AIC$X12 -0.090478   0.069956  -1.293 0.196762    
## sm_interact_ti_AIC$X13  1.334798   0.066134  20.183  < 2e-16 ***
## sm_interact_ti_AIC$X14  1.603064   0.069435  23.087  < 2e-16 ***
## sm_interact_ti_AIC$X15  0.586083   0.067904   8.631 2.36e-16 ***
## sm_interact_ti_AIC$X16 -0.684833   0.068336 -10.022  < 2e-16 ***
## sm_interact_ti_AIC$X17 -0.591823   0.067955  -8.709  < 2e-16 ***
## sm_interact_ti_AIC$X18  0.504031   0.068450   7.363 1.36e-12 ***
## sm_interact_ti_AIC$X19  1.645705   0.068511  24.021  < 2e-16 ***
## sm_interact_ti_AIC$X20  1.228727   0.067761  18.133  < 2e-16 ***
## sm_interact_ti_AIC$X21 -0.099100   0.066672  -1.486 0.138101    
## sm_interact_ti_AIC$X22 -0.963577   0.078629 -12.255  < 2e-16 ***
## sm_interact_ti_AIC$X23 -0.143390   0.074256  -1.931 0.054309 .  
## sm_interact_ti_AIC$X24  0.751646   0.070200  10.707  < 2e-16 ***
## sm_interact_ti_AIC$X25  0.961039   0.073704  13.039  < 2e-16 ***
## sm_interact_ti_AIC$X26  0.390250   0.072079   5.414 1.16e-07 ***
## sm_interact_ti_AIC$X27 -0.528900   0.072537  -7.291 2.16e-12 ***
## sm_interact_ti_AIC$X28 -0.375482   0.072133  -5.205 3.35e-07 ***
## sm_interact_ti_AIC$X29  0.342018   0.072658   4.707 3.66e-06 ***
## sm_interact_ti_AIC$X30  1.135929   0.072723  15.620  < 2e-16 ***
## sm_interact_ti_AIC$X31  0.824435   0.071926  11.462  < 2e-16 ***
## sm_interact_ti_AIC$X32 -0.141112   0.070771  -1.994 0.046955 *  
## sm_interact_ti_AIC$X33 -0.826376   0.083463  -9.901  < 2e-16 ***
## sm_interact_ti_AIC$X34  0.265108   0.072329   3.665 0.000286 ***
## sm_interact_ti_AIC$X35 -0.552549   0.068378  -8.081 1.13e-14 ***
## sm_interact_ti_AIC$X36 -0.468714   0.071791  -6.529 2.40e-10 ***
## sm_interact_ti_AIC$X37 -0.168960   0.070208  -2.407 0.016635 *  
## sm_interact_ti_AIC$X38  0.397121   0.070654   5.621 3.96e-08 ***
## sm_interact_ti_AIC$X39  0.308802   0.070260   4.395 1.48e-05 ***
## sm_interact_ti_AIC$X40 -0.153011   0.070772  -2.162 0.031311 *  
## sm_interact_ti_AIC$X41 -0.543646   0.070835  -7.675 1.76e-13 ***
## sm_interact_ti_AIC$X42 -0.392878   0.070059  -5.608 4.24e-08 ***
## sm_interact_ti_AIC$X43  0.101298   0.068934   1.469 0.142620    
## sm_interact_ti_AIC$X44  0.442306   0.081296   5.441 1.02e-07 ***
## sm_interact_ti_AIC$X45  0.060353   0.073336   0.823 0.411098    
## sm_interact_ti_AIC$X46 -0.476753   0.069330  -6.877 2.94e-11 ***
## sm_interact_ti_AIC$X47 -0.593973   0.072790  -8.160 6.52e-15 ***
## sm_interact_ti_AIC$X48 -0.193062   0.071185  -2.712 0.007025 ** 
## sm_interact_ti_AIC$X49  0.221094   0.071638   3.086 0.002193 ** 
## sm_interact_ti_AIC$X50  0.272940   0.071238   3.831 0.000152 ***
## sm_interact_ti_AIC$X51 -0.252620   0.071757  -3.520 0.000489 ***
## sm_interact_ti_AIC$X52 -0.601752   0.071821  -8.378 1.42e-15 ***
## sm_interact_ti_AIC$X53 -0.423919   0.071035  -5.968 6.03e-09 ***
## sm_interact_ti_AIC$X54  0.045911   0.069893   0.657 0.511707    
## sm_interact_ti_AIC$X55  0.269727   0.082428   3.272 0.001176 ** 
## sm_interact_ti_AIC$X56  0.054096   0.072840   0.743 0.458195    
## sm_interact_ti_AIC$X57  0.668121   0.068861   9.703  < 2e-16 ***
## sm_interact_ti_AIC$X58  0.930226   0.072298  12.867  < 2e-16 ***
## sm_interact_ti_AIC$X59  0.336051   0.070704   4.753 2.96e-06 ***
## sm_interact_ti_AIC$X60 -0.351905   0.071153  -4.946 1.19e-06 ***
## sm_interact_ti_AIC$X61 -0.430378   0.070757  -6.083 3.18e-09 ***
## sm_interact_ti_AIC$X62  0.427392   0.071272   5.997 5.13e-09 ***
## sm_interact_ti_AIC$X63  1.156448   0.071335  16.211  < 2e-16 ***
## sm_interact_ti_AIC$X64  0.740014   0.070554  10.489  < 2e-16 ***
## sm_interact_ti_AIC$X65 -0.184663   0.069420  -2.660 0.008181 ** 
## sm_interact_ti_AIC$X66 -0.513212   0.081871  -6.269 1.10e-09 ***
## sm_interact_ti_AIC$X67 -0.200106   0.072339  -2.766 0.005980 ** 
## sm_interact_ti_AIC$X68  1.188924   0.068387  17.385  < 2e-16 ***
## sm_interact_ti_AIC$X69  1.612993   0.071800  22.465  < 2e-16 ***
## sm_interact_ti_AIC$X70  0.530413   0.070217   7.554 3.92e-13 ***
## sm_interact_ti_AIC$X71 -0.746693   0.070664 -10.567  < 2e-16 ***
## sm_interact_ti_AIC$X72 -0.726324   0.070270 -10.336  < 2e-16 ***
## sm_interact_ti_AIC$X73  0.468886   0.070782   6.624 1.36e-10 ***
## sm_interact_ti_AIC$X74  1.545658   0.070845  21.817  < 2e-16 ***
## sm_interact_ti_AIC$X75  1.284259   0.070069  18.329  < 2e-16 ***
## sm_interact_ti_AIC$X76 -0.238826   0.068943  -3.464 0.000600 ***
## sm_interact_ti_AIC$X77 -1.031806   0.081307 -12.690  < 2e-16 ***
## sm_interact_ti_AIC$X78  0.059235   0.072074   0.822 0.411729    
## sm_interact_ti_AIC$X79  0.089867   0.068137   1.319 0.188078    
## sm_interact_ti_AIC$X80  0.173549   0.071537   2.426 0.015785 *  
## sm_interact_ti_AIC$X81 -0.020180   0.069960  -0.288 0.773182    
## sm_interact_ti_AIC$X82 -0.066324   0.070405  -0.942 0.346843    
## sm_interact_ti_AIC$X83 -0.062751   0.070013  -0.896 0.370736    
## sm_interact_ti_AIC$X84  0.029614   0.070522   0.420 0.674804    
## sm_interact_ti_AIC$X85  0.272070   0.070585   3.854 0.000139 ***
## sm_interact_ti_AIC$X86  0.117826   0.069812   1.688 0.092373 .  
## sm_interact_ti_AIC$X87 -0.063635   0.068690  -0.926 0.354889    
## sm_interact_ti_AIC$X88 -0.255935   0.081010  -3.159 0.001723 ** 
## sm_interact_ti_AIC$X89  0.089452   0.088732   1.008 0.314115    
## sm_interact_ti_AIC$X90 -0.776423   0.083885  -9.256  < 2e-16 ***
## sm_interact_ti_AIC$X91 -1.082152   0.088071 -12.287  < 2e-16 ***
## sm_interact_ti_AIC$X92 -0.344138   0.086130  -3.996 7.91e-05 ***
## sm_interact_ti_AIC$X93  0.613173   0.086677   7.074 8.58e-12 ***
## sm_interact_ti_AIC$X94  0.314372   0.086194   3.647 0.000306 ***
## sm_interact_ti_AIC$X95 -0.294133   0.086822  -3.388 0.000787 ***
## sm_interact_ti_AIC$X96 -1.111112   0.086899 -12.786  < 2e-16 ***
## sm_interact_ti_AIC$X97 -0.697008   0.085947  -8.110 9.24e-15 ***
## sm_interact_ti_AIC$X98 -0.023152   0.084566  -0.274 0.784428    
## sm_interact_ti_AIC$X99  0.701096   0.099733   7.030 1.13e-11 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.1129 on 341 degrees of freedom
## Multiple R-squared:  0.9659, Adjusted R-squared:  0.956 
## F-statistic: 97.52 on 99 and 341 DF,  p-value: < 2.2e-16
coefplot::coefplot(gam_basis_linear_fit_AIC) + theme_bw()

best model based on BIC fit

df_best_gam_basis_interact_BIC <- model_comp_gam_basis_interact%>% filter(BIC == min(BIC)) %>% select(df_1, df_2)
df_best_gam_basis_interact_BIC
## # A tibble: 1 x 2
##    df_1  df_2
##   <int> <int>
## 1     9     9
sm_interact_ti_BIC = smoothCon(ti(x1, x2, k=c(df_best_gam_basis_interact_BIC$df_1,df_best_gam_basis_interact_BIC$df_2)), data = train_df)[[1]]
#sm_full_ti$X
sm_interact_ti_BIC$X %>% as.data.frame() %>% tbl_df() %>% 
  tibble::rowid_to_column() %>% 
  left_join(coarse_grid %>% tibble::rowid_to_column(),
            by = "rowid") %>%
  tidyr::gather(key = "key", value = "value", -rowid, -x1, -x2) %>%
  mutate(id = factor(key, levels = as.vector(unique(key)))) %>%
  ggplot(mapping = aes(x = x1, y = x2)) +
  geom_raster(mapping = aes(fill = value)) +
  facet_wrap(~ id, labeller = "label_both") +
  scale_fill_viridis_b() +
  theme_bw()

gam_basis_linear_fit_BIC <- lm(y ~ sm_interact_ti_BIC$X, data = train_df)
gam_basis_linear_fit_BIC %>% summary()
## 
## Call:
## lm(formula = y ~ sm_interact_ti_BIC$X, data = train_df)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.253246 -0.079245 -0.000319  0.078760  0.312853 
## 
## Coefficients:
##                         Estimate Std. Error t value Pr(>|t|)    
## (Intercept)             0.003359   0.005761   0.583 0.560242    
## sm_interact_ti_BIC$X1   0.167204   0.072713   2.300 0.022024 *  
## sm_interact_ti_BIC$X2   0.359502   0.064661   5.560 5.13e-08 ***
## sm_interact_ti_BIC$X3   0.129840   0.069247   1.875 0.061565 .  
## sm_interact_ti_BIC$X4  -0.179125   0.067146  -2.668 0.007968 ** 
## sm_interact_ti_BIC$X5   0.092952   0.068312   1.361 0.174424    
## sm_interact_ti_BIC$X6   0.454562   0.066920   6.793 4.32e-11 ***
## sm_interact_ti_BIC$X7   0.015792   0.067651   0.233 0.815550    
## sm_interact_ti_BIC$X8  -0.320532   0.084612  -3.788 0.000177 ***
## sm_interact_ti_BIC$X9   0.528329   0.064661   8.171 4.72e-15 ***
## sm_interact_ti_BIC$X10  1.964099   0.057501  34.158  < 2e-16 ***
## sm_interact_ti_BIC$X11  0.435848   0.061579   7.078 7.22e-12 ***
## sm_interact_ti_BIC$X12 -0.838347   0.059711 -14.040  < 2e-16 ***
## sm_interact_ti_BIC$X13  0.455031   0.060747   7.491 4.94e-13 ***
## sm_interact_ti_BIC$X14  1.930631   0.059510  32.442  < 2e-16 ***
## sm_interact_ti_BIC$X15  0.527121   0.060160   8.762  < 2e-16 ***
## sm_interact_ti_BIC$X16 -1.136836   0.075242 -15.109  < 2e-16 ***
## sm_interact_ti_BIC$X17  0.128753   0.069247   1.859 0.063763 .  
## sm_interact_ti_BIC$X18  0.364187   0.061579   5.914 7.50e-09 ***
## sm_interact_ti_BIC$X19  0.151388   0.065947   2.296 0.022248 *  
## sm_interact_ti_BIC$X20 -0.162536   0.063946  -2.542 0.011430 *  
## sm_interact_ti_BIC$X21  0.155776   0.065056   2.394 0.017133 *  
## sm_interact_ti_BIC$X22  0.564252   0.063731   8.854  < 2e-16 ***
## sm_interact_ti_BIC$X23  0.081825   0.064427   1.270 0.204856    
## sm_interact_ti_BIC$X24 -0.357090   0.080579  -4.432 1.23e-05 ***
## sm_interact_ti_BIC$X25 -0.186557   0.067146  -2.778 0.005738 ** 
## sm_interact_ti_BIC$X26 -0.908138   0.059711 -15.209  < 2e-16 ***
## sm_interact_ti_BIC$X27 -0.172732   0.063946  -2.701 0.007221 ** 
## sm_interact_ti_BIC$X28  0.470931   0.062006   7.595 2.47e-13 ***
## sm_interact_ti_BIC$X29 -0.244964   0.063082  -3.883 0.000122 ***
## sm_interact_ti_BIC$X30 -0.978698   0.061797 -15.837  < 2e-16 ***
## sm_interact_ti_BIC$X31 -0.165715   0.062472  -2.653 0.008325 ** 
## sm_interact_ti_BIC$X32  0.555098   0.078134   7.104 6.10e-12 ***
## sm_interact_ti_BIC$X33  0.152059   0.068312   2.226 0.026609 *  
## sm_interact_ti_BIC$X34  0.294787   0.060747   4.853 1.79e-06 ***
## sm_interact_ti_BIC$X35  0.107356   0.065056   1.650 0.099736 .  
## sm_interact_ti_BIC$X36 -0.168648   0.063082  -2.673 0.007835 ** 
## sm_interact_ti_BIC$X37  0.130884   0.064177   2.039 0.042107 *  
## sm_interact_ti_BIC$X38  0.541178   0.062869   8.608  < 2e-16 ***
## sm_interact_ti_BIC$X39  0.007874   0.063556   0.124 0.901470    
## sm_interact_ti_BIC$X40 -0.234192   0.079490  -2.946 0.003418 ** 
## sm_interact_ti_BIC$X41  0.451007   0.066920   6.739 5.99e-11 ***
## sm_interact_ti_BIC$X42  1.870396   0.059510  31.430  < 2e-16 ***
## sm_interact_ti_BIC$X43  0.442466   0.063731   6.943 1.70e-11 ***
## sm_interact_ti_BIC$X44 -0.893327   0.061797 -14.456  < 2e-16 ***
## sm_interact_ti_BIC$X45  0.396568   0.062869   6.308 7.96e-10 ***
## sm_interact_ti_BIC$X46  1.921517   0.061589  31.199  < 2e-16 ***
## sm_interact_ti_BIC$X47  0.409775   0.062261   6.582 1.57e-10 ***
## sm_interact_ti_BIC$X48 -1.090251   0.077871 -14.001  < 2e-16 ***
## sm_interact_ti_BIC$X49  0.114357   0.067651   1.690 0.091782 .  
## sm_interact_ti_BIC$X50  0.432046   0.060160   7.182 3.72e-12 ***
## sm_interact_ti_BIC$X51  0.036840   0.064427   0.572 0.567797    
## sm_interact_ti_BIC$X52 -0.201191   0.062472  -3.220 0.001391 ** 
## sm_interact_ti_BIC$X53  0.064322   0.063556   1.012 0.312163    
## sm_interact_ti_BIC$X54  0.505540   0.062261   8.120 6.76e-15 ***
## sm_interact_ti_BIC$X55  0.069103   0.062942   1.098 0.272957    
## sm_interact_ti_BIC$X56 -0.417555   0.078721  -5.304 1.94e-07 ***
## sm_interact_ti_BIC$X57 -0.246364   0.084612  -2.912 0.003809 ** 
## sm_interact_ti_BIC$X58 -1.214235   0.075242 -16.138  < 2e-16 ***
## sm_interact_ti_BIC$X59 -0.195914   0.080579  -2.431 0.015510 *  
## sm_interact_ti_BIC$X60  0.577106   0.078134   7.386 9.84e-13 ***
## sm_interact_ti_BIC$X61 -0.304493   0.079490  -3.831 0.000150 ***
## sm_interact_ti_BIC$X62 -1.116641   0.077871 -14.340  < 2e-16 ***
## sm_interact_ti_BIC$X63 -0.332273   0.078721  -4.221 3.05e-05 ***
## sm_interact_ti_BIC$X64  0.715192   0.098457   7.264 2.18e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.121 on 376 degrees of freedom
## Multiple R-squared:  0.9568, Adjusted R-squared:  0.9495 
## F-statistic: 130.3 on 64 and 376 DF,  p-value: < 2.2e-16
coefplot::coefplot(gam_basis_linear_fit_BIC) + theme_bw()

Using gam function from mgcv package

gam_fit_func_interact <- function(df_1, df_2, data){
  model <- gam(y ~ ti(x1, x2, k=c(df_1,df_2)), data = data, method = 'REML')
  metrics <- glance(model) %>% mutate(df_1 = df_1, df_2 = df_2)
  return(metrics)
}
gam_model_comp_interact <- map2_dfr(df_grid_interact$x1, df_grid_interact$x2, gam_fit_func_interact, data = train_df)
gam_model_comp_interact %>% arrange(AIC) %>% mutate(AIC_rank = 1:n()) %>%
  ggplot(mapping = aes(x = as.factor(df_1), y= as.factor(df_2))) +
  geom_tile(mapping = aes(fill = AIC)) +
  geom_text(mapping = aes(label = AIC_rank), color = "white") 

gam_model_comp_interact %>% arrange(BIC) %>% mutate(BIC_rank = 1:n()) %>%
  ggplot(mapping = aes(x = as.factor(df_1), y= as.factor(df_2))) +
  geom_tile(mapping = aes(fill = BIC)) +
  geom_text(mapping = aes(label = BIC_rank), color = "white") 

Best fit based on AIC (problem here is the best model changes based on the grid space when the grid was between 5:15 the best model was 12,14 now the model changes to 16,12 and when I am using grid space of 5:20 the best model is 20,20 where as the BIC is constant around best model of 9,9)

gam_best_AIC_model_interact <- gam_model_comp_interact%>% filter(AIC == min(AIC)) %>% select(df_1, df_2)
gam_best_AIC_model_interact
## # A tibble: 1 x 2
##    df_1  df_2
##   <int> <int>
## 1    16    12
gam_best_model_fit_interact_ti_AIC <- gam(y ~ ti(x1, x2, k=c(gam_best_AIC_model_interact$df_1[1],gam_best_AIC_model_interact$df_2[1])), data = train_df, method = 'REML')
summary(gam_best_model_fit_interact_ti_AIC)
## 
## Family: gaussian 
## Link function: identity 
## 
## Formula:
## y ~ ti(x1, x2, k = c(gam_best_AIC_model_interact$df_1[1], gam_best_AIC_model_interact$df_2[1]))
## 
## Parametric coefficients:
##             Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.003359   0.005120   0.656    0.512
## 
## Approximate significance of smooth terms:
##             edf Ref.df     F p-value    
## ti(x1,x2) 129.3  150.7 70.23  <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## R-sq.(adj) =   0.96   Deviance explained = 97.2%
## -REML = -157.82  Scale est. = 0.011561  n = 441
gam_best_model_fit_interact_ti_AIC
## 
## Family: gaussian 
## Link function: identity 
## 
## Formula:
## y ~ ti(x1, x2, k = c(gam_best_AIC_model_interact$df_1[1], gam_best_AIC_model_interact$df_2[1]))
## 
## Estimated degrees of freedom:
## 129  total = 130.33 
## 
## REML score: -157.8209

Best fit based on BIC

gam_best_BIC_model_interact <- gam_model_comp_interact%>% filter(BIC == min(BIC)) %>% select(df_1, df_2)
gam_best_BIC_model_interact
## # A tibble: 1 x 2
##    df_1  df_2
##   <int> <int>
## 1     9     9
gam_best_model_fit_interact_ti_BIC <- gam(y ~ ti(x1, x2, k=c(gam_best_BIC_model_interact$df_1[1],gam_best_BIC_model_interact$df_2[1])), data = train_df, method = 'REML')
summary(gam_best_model_fit_interact_ti_BIC)
## 
## Family: gaussian 
## Link function: identity 
## 
## Formula:
## y ~ ti(x1, x2, k = c(gam_best_BIC_model_interact$df_1[1], gam_best_BIC_model_interact$df_2[1]))
## 
## Parametric coefficients:
##             Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.003359   0.005753   0.584     0.56
## 
## Approximate significance of smooth terms:
##             edf Ref.df     F p-value    
## ti(x1,x2) 62.09  63.88 129.9  <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## R-sq.(adj) =   0.95   Deviance explained = 95.7%
## -REML = -162.76  Scale est. = 0.014596  n = 441
gam_best_model_fit_interact_ti_BIC
## 
## Family: gaussian 
## Link function: identity 
## 
## Formula:
## y ~ ti(x1, x2, k = c(gam_best_BIC_model_interact$df_1[1], gam_best_BIC_model_interact$df_2[1]))
## 
## Estimated degrees of freedom:
## 62.1  total = 63.09 
## 
## REML score: -162.7627

Interaction fit using linear models and ns() basis functions

model_fit_func_interact <- function(df_1, df_2, data){
  model <- lm(y ~ ns(x1, df = df_1):ns(x2, df=df_2), data = data)
  metrics <- glance(model) %>% mutate(df_1 = df_1, df_2 = df_2)
  return(metrics)
}
model_comp_df_interact <- map2_dfr(df_grid_interact$x1, df_grid_interact$x2, model_fit_func_interact, data = train_df)
model_comp_df_interact %>% arrange(AIC) %>% mutate(AIC_rank = 1:n()) %>%
  ggplot(mapping = aes(x = as.factor(df_1), y= as.factor(df_2))) +
  geom_tile(mapping = aes(fill = AIC)) +
  geom_text(mapping = aes(label = AIC_rank), color = "white") 

model_comp_df_interact %>% arrange(BIC) %>% mutate(BIC_rank = 1:n()) %>%
  ggplot(mapping = aes(x = as.factor(df_1), y= as.factor(df_2))) +
  geom_tile(mapping = aes(fill = BIC)) +
  geom_text(mapping = aes(label = BIC_rank), color = "white") 

Best AIC fit

df_best_AIC_model_interact <- model_comp_df_interact%>% filter(AIC == min(AIC)) %>% select(df_1, df_2)
df_best_AIC_model_interact
## # A tibble: 1 x 2
##    df_1  df_2
##   <int> <int>
## 1     8    11
best_AIC_fit_interact <- lm(y ~ ns(x1, df = df_best_AIC_model_interact$df_1[1]):ns(x2, df=df_best_AIC_model_interact$df_2[1]), data = train_df)
best_AIC_fit_interact %>% summary()
## 
## Call:
## lm(formula = y ~ ns(x1, df = df_best_AIC_model_interact$df_1[1]):ns(x2, 
##     df = df_best_AIC_model_interact$df_2[1]), data = train_df)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.19239 -0.07941  0.00179  0.08745  1.04562 
## 
## Coefficients:
##                                                                                                      Estimate
## (Intercept)                                                                                         0.0145248
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])1   1.5923518
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])1  -0.1495582
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])1  -1.1465002
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])1   0.1316674
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])1   0.9896327
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])1  -0.0548842
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])1  -1.1370929
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])1  -0.2301702
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])2   2.2148064
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])2  -0.1830021
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])2  -1.6969149
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])2  -0.1762000
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])2   2.0372040
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])2  -0.0346329
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])2  -1.9988974
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])2  -0.5077348
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])3   0.7858809
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])3   0.1513618
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])3  -0.7907491
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])3   0.0756874
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])3   0.7584032
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])3  -0.1950726
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])3  -0.7820500
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])3  -0.4068627
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])4  -2.2467959
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])4  -0.1721373
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])4   1.7027928
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])4  -0.0977259
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])4  -1.8157812
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])4   0.0451531
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])4   1.9294741
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])4   0.8334425
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])5  -1.8222899
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])5   0.0643066
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])5   1.6544218
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])5  -0.1411270
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])5  -1.7245369
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])5   0.2847958
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])5   1.4405875
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])5   0.1764955
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])6   0.4321969
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])6   0.0712281
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])6  -0.8686859
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])6   0.2545310
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])6   0.4882282
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])6  -0.1258275
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])6  -0.3788741
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])6  -0.0721818
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])7   2.4585815
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])7   0.3424413
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])7  -2.4467624
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])7   0.4641626
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])7   2.0125115
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])7   0.0918826
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])7  -2.3143840
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])7  -0.6969845
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])8   0.6741194
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])8  -0.1369626
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])8  -0.5869027
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])8  -0.1940311
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])8   0.7398458
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])8  -0.1423476
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])8  -0.4909828
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])8  -0.1035307
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])9  -0.8046263
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])9  -0.1486470
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])9   1.1472652
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])9  -0.1908169
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])9  -0.9467497
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])9   0.1791451
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])9   0.4824146
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])9   0.2570256
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])10 -4.0832546
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])10 -0.0765254
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])10  3.2383625
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])10 -0.0648256
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])10 -3.2130041
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])10  0.1960887
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])10  3.3769507
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])10  0.8078839
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])11 -0.1463986
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])11 -0.1440769
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])11  0.3972607
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])11 -0.0007138
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])11 -0.1195236
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])11 -0.2005818
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])11  0.3639963
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])11  0.2670634
##                                                                                                    Std. Error
## (Intercept)                                                                                         0.0414759
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])1   0.6358891
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])1   0.6289458
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])1   0.6984035
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])1   0.6317003
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])1   0.6482901
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])1   0.6383700
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])1   0.5602950
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])1   0.5531943
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])2   0.6004440
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])2   0.5946881
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])2   0.6596638
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])2   0.5970595
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])2   0.6125581
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])2   0.6026833
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])2   0.5344809
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])2   0.5219319
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])3   0.5897823
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])3   0.5837834
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])3   0.6478686
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])3   0.5862117
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])3   0.6015069
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])3   0.5920264
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])3   0.5226604
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])3   0.5128484
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])4   0.5871841
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])4   0.5814213
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])4   0.6450643
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])4   0.5837788
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])4   0.5989629
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])4   0.5893912
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])4   0.5217746
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])4   0.5104773
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])5   0.5871876
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])5   0.5813169
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])5   0.6450426
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])5   0.5837053
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])5   0.5989120
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])5   0.5894087
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])5   0.5210490
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])5   0.5105379
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])6   0.5902162
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])6   0.5843597
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])6   0.6483802
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])6   0.5867477
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])6   0.6020236
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])6   0.5924430
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])6   0.5240368
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])6   0.5131475
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])7   0.6015484
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])7   0.5955030
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])7   0.6608110
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])7   0.5979588
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])7   0.6135439
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])7   0.6038279
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])7   0.5335818
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])7   0.5230407
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])8   0.6412328
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])8   0.6346551
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])8   0.7043732
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])8   0.6373111
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])8   0.6539521
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])8   0.6436799
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])8   0.5678792
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])8   0.5576172
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])9   0.5859438
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])9   0.5795270
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])9   0.6435436
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])9   0.5820706
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])9   0.5973613
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])9   0.5882323
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])9   0.5161592
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])9   0.5097542
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])10  0.5276317
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])10  0.5275235
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])10  0.5808507
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])10  0.5281931
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])10  0.5407843
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])10  0.5289564
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])10  0.5020620
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])10  0.4559780
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])11  0.4983571
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])11  0.4924056
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])11  0.5472297
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])11  0.4947107
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])11  0.5078185
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])11  0.5003671
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])11  0.4356346
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])11  0.4338191
##                                                                                                    t value
## (Intercept)                                                                                          0.350
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])1    2.504
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])1   -0.238
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])1   -1.642
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])1    0.208
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])1    1.527
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])1   -0.086
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])1   -2.029
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])1   -0.416
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])2    3.689
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])2   -0.308
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])2   -2.572
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])2   -0.295
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])2    3.326
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])2   -0.057
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])2   -3.740
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])2   -0.973
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])3    1.332
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])3    0.259
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])3   -1.221
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])3    0.129
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])3    1.261
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])3   -0.329
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])3   -1.496
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])3   -0.793
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])4   -3.826
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])4   -0.296
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])4    2.640
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])4   -0.167
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])4   -3.032
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])4    0.077
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])4    3.698
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])4    1.633
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])5   -3.103
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])5    0.111
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])5    2.565
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])5   -0.242
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])5   -2.879
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])5    0.483
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])5    2.765
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])5    0.346
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])6    0.732
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])6    0.122
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])6   -1.340
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])6    0.434
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])6    0.811
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])6   -0.212
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])6   -0.723
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])6   -0.141
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])7    4.087
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])7    0.575
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])7   -3.703
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])7    0.776
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])7    3.280
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])7    0.152
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])7   -4.337
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])7   -1.333
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])8    1.051
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])8   -0.216
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])8   -0.833
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])8   -0.304
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])8    1.131
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])8   -0.221
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])8   -0.865
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])8   -0.186
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])9   -1.373
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])9   -0.256
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])9    1.783
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])9   -0.328
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])9   -1.585
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])9    0.305
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])9    0.935
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])9    0.504
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])10  -7.739
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])10  -0.145
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])10   5.575
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])10  -0.123
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])10  -5.941
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])10   0.371
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])10   6.726
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])10   1.772
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])11  -0.294
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])11  -0.293
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])11   0.726
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])11  -0.001
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])11  -0.235
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])11  -0.401
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])11   0.836
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])11   0.616
##                                                                                                    Pr(>|t|)
## (Intercept)                                                                                        0.726400
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])1  0.012727
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])1  0.812181
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])1  0.101566
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])1  0.835011
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])1  0.127777
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])1  0.931535
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])1  0.043164
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])1  0.677609
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])2  0.000261
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])2  0.758471
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])2  0.010509
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])2  0.768082
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])2  0.000975
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])2  0.954208
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])2  0.000215
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])2  0.331321
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])3  0.183560
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])3  0.795573
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])3  0.223077
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])3  0.897342
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])3  0.208202
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])3  0.741974
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])3  0.135475
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])3  0.428115
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])4  0.000154
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])4  0.767357
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])4  0.008666
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])4  0.867150
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])4  0.002613
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])4  0.938978
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])4  0.000252
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])4  0.103432
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])5  0.002068
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])5  0.911979
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])5  0.010737
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])5  0.809093
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])5  0.004227
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])5  0.629262
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])5  0.005996
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])5  0.729771
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])6  0.464492
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])6  0.903055
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])6  0.181182
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])6  0.664700
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])6  0.417926
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])6  0.831928
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])6  0.470165
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])6  0.888215
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])7  5.42e-05
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])7  0.565628
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])7  0.000248
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])7  0.438125
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])7  0.001141
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])7  0.879143
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])7  1.89e-05
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])7  0.183537
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])8  0.293848
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])8  0.829264
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])8  0.405282
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])8  0.760963
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])8  0.258680
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])8  0.825106
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])8  0.387853
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])8  0.852813
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])9  0.170560
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])9  0.797717
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])9  0.075492
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])9  0.743239
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])9  0.113890
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])9  0.760890
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])9  0.350623
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])9  0.614426
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])10 1.07e-13
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])10 0.884742
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])10 4.93e-08
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])10 0.902390
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])10 6.79e-09
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])10 0.711078
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])10 7.06e-11
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])10 0.077299
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])11 0.769112
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])11 0.770002
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])11 0.468353
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])11 0.998850
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])11 0.814061
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])11 0.688760
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])11 0.403973
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])11 0.538550
##                                                                                                       
## (Intercept)                                                                                           
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])1  *  
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])1     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])1     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])1     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])1     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])1     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])1  *  
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])1     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])2  ***
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])2     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])2  *  
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])2     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])2  ***
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])2     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])2  ***
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])2     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])3     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])3     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])3     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])3     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])3     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])3     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])3     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])3     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])4  ***
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])4     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])4  ** 
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])4     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])4  ** 
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])4     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])4  ***
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])4     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])5  ** 
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])5     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])5  *  
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])5     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])5  ** 
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])5     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])5  ** 
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])5     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])6     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])6     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])6     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])6     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])6     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])6     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])6     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])6     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])7  ***
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])7     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])7  ***
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])7     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])7  ** 
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])7     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])7  ***
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])7     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])8     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])8     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])8     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])8     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])8     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])8     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])8     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])8     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])9     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])9     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])9  .  
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])9     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])9     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])9     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])9     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])9     
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])10 ***
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])10    
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])10 ***
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])10    
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])10 ***
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])10    
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])10 ***
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])10 .  
## ns(x1, df = df_best_AIC_model_interact$df_1[1])1:ns(x2, df = df_best_AIC_model_interact$df_2[1])11    
## ns(x1, df = df_best_AIC_model_interact$df_1[1])2:ns(x2, df = df_best_AIC_model_interact$df_2[1])11    
## ns(x1, df = df_best_AIC_model_interact$df_1[1])3:ns(x2, df = df_best_AIC_model_interact$df_2[1])11    
## ns(x1, df = df_best_AIC_model_interact$df_1[1])4:ns(x2, df = df_best_AIC_model_interact$df_2[1])11    
## ns(x1, df = df_best_AIC_model_interact$df_1[1])5:ns(x2, df = df_best_AIC_model_interact$df_2[1])11    
## ns(x1, df = df_best_AIC_model_interact$df_1[1])6:ns(x2, df = df_best_AIC_model_interact$df_2[1])11    
## ns(x1, df = df_best_AIC_model_interact$df_1[1])7:ns(x2, df = df_best_AIC_model_interact$df_2[1])11    
## ns(x1, df = df_best_AIC_model_interact$df_1[1])8:ns(x2, df = df_best_AIC_model_interact$df_2[1])11    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2783 on 352 degrees of freedom
## Multiple R-squared:  0.7863, Adjusted R-squared:  0.7328 
## F-statistic: 14.71 on 88 and 352 DF,  p-value: < 2.2e-16
coefplot::coefplot(best_AIC_fit_interact) + theme_bw()

### interaction effects on the coarse grid
model.matrix( ~ ns(x1, df = df_best_AIC_model_interact$df_1[1]):ns(x2, df=df_best_AIC_model_interact$df_2[1]), train_df)  %>% 
  as.data.frame() %>% tibble::as_tibble() %>% 
  select(-`(Intercept)`) %>% 
  tibble::rowid_to_column() %>% 
  left_join(coarse_grid %>% tibble::rowid_to_column(),
            by = "rowid") %>% 
  tidyr::gather(key = "key", value = "value", -rowid, -x1, -x2) %>% 
  tidyr::separate(key,
                  c("left_word", "right_word"),
                  sep = ":",
                  fill = "right",
                  remove = FALSE) %>% 
  filter(!is.na(right_word)) %>% 
  tidyr::separate(left_word,
                  c("ns_x1_word", "x1_s_id"),
                  sep = "\\)",
                  remove = FALSE) %>% 
  tidyr::separate(right_word,
                  c("ns_x2_word", "x2_s_id"),
                  sep = "\\)",
                  remove = FALSE) %>% 
  ggplot(mapping = aes(x = x1, y = x2)) +
  geom_raster(mapping = aes(fill = value)) +
  facet_grid(x1_s_id ~ x2_s_id, labeller = "label_both") +
  scale_fill_viridis_b() +
  theme_bw()

Best BIC fit

df_best_BIC_model_interact <- model_comp_df_interact%>% filter(BIC == min(BIC)) %>% select(df_1, df_2)
df_best_BIC_model_interact
## # A tibble: 1 x 2
##    df_1  df_2
##   <int> <int>
## 1     8     8
best_BIC_fit_interact <- lm(y ~ ns(x1, df = df_best_BIC_model_interact$df_1[1]):ns(x2, df=df_best_BIC_model_interact$df_2[1]), data = train_df)
best_BIC_fit_interact %>% summary()
## 
## Call:
## lm(formula = y ~ ns(x1, df = df_best_BIC_model_interact$df_1[1]):ns(x2, 
##     df = df_best_BIC_model_interact$df_2[1]), data = train_df)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.18944 -0.09591  0.00095  0.09900  1.04857 
## 
## Coefficients:
##                                                                                                     Estimate
## (Intercept)                                                                                        0.0115758
## ns(x1, df = df_best_BIC_model_interact$df_1[1])1:ns(x2, df = df_best_BIC_model_interact$df_2[1])1  3.8928251
## ns(x1, df = df_best_BIC_model_interact$df_1[1])2:ns(x2, df = df_best_BIC_model_interact$df_2[1])1 -0.2282850
## ns(x1, df = df_best_BIC_model_interact$df_1[1])3:ns(x2, df = df_best_BIC_model_interact$df_2[1])1 -2.8207020
## ns(x1, df = df_best_BIC_model_interact$df_1[1])4:ns(x2, df = df_best_BIC_model_interact$df_2[1])1 -0.1383565
## ns(x1, df = df_best_BIC_model_interact$df_1[1])5:ns(x2, df = df_best_BIC_model_interact$df_2[1])1  3.1985932
## ns(x1, df = df_best_BIC_model_interact$df_1[1])6:ns(x2, df = df_best_BIC_model_interact$df_2[1])1 -0.0983347
## ns(x1, df = df_best_BIC_model_interact$df_1[1])7:ns(x2, df = df_best_BIC_model_interact$df_2[1])1 -3.2732683
## ns(x1, df = df_best_BIC_model_interact$df_1[1])8:ns(x2, df = df_best_BIC_model_interact$df_2[1])1 -0.8426895
## ns(x1, df = df_best_BIC_model_interact$df_1[1])1:ns(x2, df = df_best_BIC_model_interact$df_2[1])2 -0.3507640
## ns(x1, df = df_best_BIC_model_interact$df_1[1])2:ns(x2, df = df_best_BIC_model_interact$df_2[1])2  0.1325802
## ns(x1, df = df_best_BIC_model_interact$df_1[1])3:ns(x2, df = df_best_BIC_model_interact$df_2[1])2 -0.0697339
## ns(x1, df = df_best_BIC_model_interact$df_1[1])4:ns(x2, df = df_best_BIC_model_interact$df_2[1])2  0.0897294
## ns(x1, df = df_best_BIC_model_interact$df_1[1])5:ns(x2, df = df_best_BIC_model_interact$df_2[1])2 -0.0349953
## ns(x1, df = df_best_BIC_model_interact$df_1[1])6:ns(x2, df = df_best_BIC_model_interact$df_2[1])2 -0.1971425
## ns(x1, df = df_best_BIC_model_interact$df_1[1])7:ns(x2, df = df_best_BIC_model_interact$df_2[1])2  0.1468833
## ns(x1, df = df_best_BIC_model_interact$df_1[1])8:ns(x2, df = df_best_BIC_model_interact$df_2[1])2 -0.0224461
## ns(x1, df = df_best_BIC_model_interact$df_1[1])1:ns(x2, df = df_best_BIC_model_interact$df_2[1])3 -2.8916369
## ns(x1, df = df_best_BIC_model_interact$df_1[1])2:ns(x2, df = df_best_BIC_model_interact$df_2[1])3 -0.1741504
## ns(x1, df = df_best_BIC_model_interact$df_1[1])3:ns(x2, df = df_best_BIC_model_interact$df_2[1])3  2.5965267
## ns(x1, df = df_best_BIC_model_interact$df_1[1])4:ns(x2, df = df_best_BIC_model_interact$df_2[1])3 -0.2551127
## ns(x1, df = df_best_BIC_model_interact$df_1[1])5:ns(x2, df = df_best_BIC_model_interact$df_2[1])3 -2.5984828
## ns(x1, df = df_best_BIC_model_interact$df_1[1])6:ns(x2, df = df_best_BIC_model_interact$df_2[1])3  0.2841755
## ns(x1, df = df_best_BIC_model_interact$df_1[1])7:ns(x2, df = df_best_BIC_model_interact$df_2[1])3  2.5168832
## ns(x1, df = df_best_BIC_model_interact$df_1[1])8:ns(x2, df = df_best_BIC_model_interact$df_2[1])3  0.8210287
## ns(x1, df = df_best_BIC_model_interact$df_1[1])1:ns(x2, df = df_best_BIC_model_interact$df_2[1])4  0.0117640
## ns(x1, df = df_best_BIC_model_interact$df_1[1])2:ns(x2, df = df_best_BIC_model_interact$df_2[1])4  0.1597719
## ns(x1, df = df_best_BIC_model_interact$df_1[1])3:ns(x2, df = df_best_BIC_model_interact$df_2[1])4 -0.3523126
## ns(x1, df = df_best_BIC_model_interact$df_1[1])4:ns(x2, df = df_best_BIC_model_interact$df_2[1])4  0.2026739
## ns(x1, df = df_best_BIC_model_interact$df_1[1])5:ns(x2, df = df_best_BIC_model_interact$df_2[1])4 -0.0003992
## ns(x1, df = df_best_BIC_model_interact$df_1[1])6:ns(x2, df = df_best_BIC_model_interact$df_2[1])4  0.0196352
## ns(x1, df = df_best_BIC_model_interact$df_1[1])7:ns(x2, df = df_best_BIC_model_interact$df_2[1])4 -0.1360107
## ns(x1, df = df_best_BIC_model_interact$df_1[1])8:ns(x2, df = df_best_BIC_model_interact$df_2[1])4 -0.1894912
## ns(x1, df = df_best_BIC_model_interact$df_1[1])1:ns(x2, df = df_best_BIC_model_interact$df_2[1])5  2.9069133
## ns(x1, df = df_best_BIC_model_interact$df_1[1])2:ns(x2, df = df_best_BIC_model_interact$df_2[1])5  0.2768486
## ns(x1, df = df_best_BIC_model_interact$df_1[1])3:ns(x2, df = df_best_BIC_model_interact$df_2[1])5 -2.9616996
## ns(x1, df = df_best_BIC_model_interact$df_1[1])4:ns(x2, df = df_best_BIC_model_interact$df_2[1])5  0.4635208
## ns(x1, df = df_best_BIC_model_interact$df_1[1])5:ns(x2, df = df_best_BIC_model_interact$df_2[1])5  2.5884432
## ns(x1, df = df_best_BIC_model_interact$df_1[1])6:ns(x2, df = df_best_BIC_model_interact$df_2[1])5 -0.0876292
## ns(x1, df = df_best_BIC_model_interact$df_1[1])7:ns(x2, df = df_best_BIC_model_interact$df_2[1])5 -2.5253568
## ns(x1, df = df_best_BIC_model_interact$df_1[1])8:ns(x2, df = df_best_BIC_model_interact$df_2[1])5 -0.6690036
## ns(x1, df = df_best_BIC_model_interact$df_1[1])1:ns(x2, df = df_best_BIC_model_interact$df_2[1])6 -0.1144000
## ns(x1, df = df_best_BIC_model_interact$df_1[1])2:ns(x2, df = df_best_BIC_model_interact$df_2[1])6 -0.2065090
## ns(x1, df = df_best_BIC_model_interact$df_1[1])3:ns(x2, df = df_best_BIC_model_interact$df_2[1])6  0.5567496
## ns(x1, df = df_best_BIC_model_interact$df_1[1])4:ns(x2, df = df_best_BIC_model_interact$df_2[1])6 -0.4035671
## ns(x1, df = df_best_BIC_model_interact$df_1[1])5:ns(x2, df = df_best_BIC_model_interact$df_2[1])6 -0.2318753
## ns(x1, df = df_best_BIC_model_interact$df_1[1])6:ns(x2, df = df_best_BIC_model_interact$df_2[1])6  0.0913081
## ns(x1, df = df_best_BIC_model_interact$df_1[1])7:ns(x2, df = df_best_BIC_model_interact$df_2[1])6 -0.0475657
## ns(x1, df = df_best_BIC_model_interact$df_1[1])8:ns(x2, df = df_best_BIC_model_interact$df_2[1])6  0.0464544
## ns(x1, df = df_best_BIC_model_interact$df_1[1])1:ns(x2, df = df_best_BIC_model_interact$df_2[1])7 -3.2214943
## ns(x1, df = df_best_BIC_model_interact$df_1[1])2:ns(x2, df = df_best_BIC_model_interact$df_2[1])7 -0.1466516
## ns(x1, df = df_best_BIC_model_interact$df_1[1])3:ns(x2, df = df_best_BIC_model_interact$df_2[1])7  2.6369996
## ns(x1, df = df_best_BIC_model_interact$df_1[1])4:ns(x2, df = df_best_BIC_model_interact$df_2[1])7 -0.0120050
## ns(x1, df = df_best_BIC_model_interact$df_1[1])5:ns(x2, df = df_best_BIC_model_interact$df_2[1])7 -2.7063507
## ns(x1, df = df_best_BIC_model_interact$df_1[1])6:ns(x2, df = df_best_BIC_model_interact$df_2[1])7  0.1574008
## ns(x1, df = df_best_BIC_model_interact$df_1[1])7:ns(x2, df = df_best_BIC_model_interact$df_2[1])7  2.7784511
## ns(x1, df = df_best_BIC_model_interact$df_1[1])8:ns(x2, df = df_best_BIC_model_interact$df_2[1])7  0.7285096
## ns(x1, df = df_best_BIC_model_interact$df_1[1])1:ns(x2, df = df_best_BIC_model_interact$df_2[1])8 -0.7355658
## ns(x1, df = df_best_BIC_model_interact$df_1[1])2:ns(x2, df = df_best_BIC_model_interact$df_2[1])8 -0.0924275
## ns(x1, df = df_best_BIC_model_interact$df_1[1])3:ns(x2, df = df_best_BIC_model_interact$df_2[1])8  0.8569092
## ns(x1, df = df_best_BIC_model_interact$df_1[1])4:ns(x2, df = df_best_BIC_model_interact$df_2[1])8 -0.0653326
## ns(x1, df = df_best_BIC_model_interact$df_1[1])5:ns(x2, df = df_best_BIC_model_interact$df_2[1])8 -0.4999190
## ns(x1, df = df_best_BIC_model_interact$df_1[1])6:ns(x2, df = df_best_BIC_model_interact$df_2[1])8 -0.1237863
## ns(x1, df = df_best_BIC_model_interact$df_1[1])7:ns(x2, df = df_best_BIC_model_interact$df_2[1])8  0.7143756
## ns(x1, df = df_best_BIC_model_interact$df_1[1])8:ns(x2, df = df_best_BIC_model_interact$df_2[1])8  0.3073630
##                                                                                                   Std. Error
## (Intercept)                                                                                        0.0411691
## ns(x1, df = df_best_BIC_model_interact$df_1[1])1:ns(x2, df = df_best_BIC_model_interact$df_2[1])1  0.5157131
## ns(x1, df = df_best_BIC_model_interact$df_1[1])2:ns(x2, df = df_best_BIC_model_interact$df_2[1])1  0.5102193
## ns(x1, df = df_best_BIC_model_interact$df_1[1])3:ns(x2, df = df_best_BIC_model_interact$df_2[1])1  0.5664455
## ns(x1, df = df_best_BIC_model_interact$df_1[1])4:ns(x2, df = df_best_BIC_model_interact$df_2[1])1  0.5124138
## ns(x1, df = df_best_BIC_model_interact$df_1[1])5:ns(x2, df = df_best_BIC_model_interact$df_2[1])1  0.5258397
## ns(x1, df = df_best_BIC_model_interact$df_1[1])6:ns(x2, df = df_best_BIC_model_interact$df_2[1])1  0.5177074
## ns(x1, df = df_best_BIC_model_interact$df_1[1])7:ns(x2, df = df_best_BIC_model_interact$df_2[1])1  0.4553383
## ns(x1, df = df_best_BIC_model_interact$df_1[1])8:ns(x2, df = df_best_BIC_model_interact$df_2[1])1  0.4485735
## ns(x1, df = df_best_BIC_model_interact$df_1[1])1:ns(x2, df = df_best_BIC_model_interact$df_2[1])2  0.5102193
## ns(x1, df = df_best_BIC_model_interact$df_1[1])2:ns(x2, df = df_best_BIC_model_interact$df_2[1])2  0.5058981
## ns(x1, df = df_best_BIC_model_interact$df_1[1])3:ns(x2, df = df_best_BIC_model_interact$df_2[1])2  0.5606760
## ns(x1, df = df_best_BIC_model_interact$df_1[1])4:ns(x2, df = df_best_BIC_model_interact$df_2[1])2  0.5077499
## ns(x1, df = df_best_BIC_model_interact$df_1[1])5:ns(x2, df = df_best_BIC_model_interact$df_2[1])2  0.5208011
## ns(x1, df = df_best_BIC_model_interact$df_1[1])6:ns(x2, df = df_best_BIC_model_interact$df_2[1])2  0.5120484
## ns(x1, df = df_best_BIC_model_interact$df_1[1])7:ns(x2, df = df_best_BIC_model_interact$df_2[1])2  0.4579938
## ns(x1, df = df_best_BIC_model_interact$df_1[1])8:ns(x2, df = df_best_BIC_model_interact$df_2[1])2  0.4432003
## ns(x1, df = df_best_BIC_model_interact$df_1[1])1:ns(x2, df = df_best_BIC_model_interact$df_2[1])3  0.5664455
## ns(x1, df = df_best_BIC_model_interact$df_1[1])2:ns(x2, df = df_best_BIC_model_interact$df_2[1])3  0.5606760
## ns(x1, df = df_best_BIC_model_interact$df_1[1])3:ns(x2, df = df_best_BIC_model_interact$df_2[1])3  0.6222316
## ns(x1, df = df_best_BIC_model_interact$df_1[1])4:ns(x2, df = df_best_BIC_model_interact$df_2[1])3  0.5630105
## ns(x1, df = df_best_BIC_model_interact$df_1[1])5:ns(x2, df = df_best_BIC_model_interact$df_2[1])3  0.5777021
## ns(x1, df = df_best_BIC_model_interact$df_1[1])6:ns(x2, df = df_best_BIC_model_interact$df_2[1])3  0.5686019
## ns(x1, df = df_best_BIC_model_interact$df_1[1])7:ns(x2, df = df_best_BIC_model_interact$df_2[1])3  0.5019250
## ns(x1, df = df_best_BIC_model_interact$df_1[1])8:ns(x2, df = df_best_BIC_model_interact$df_2[1])3  0.4925601
## ns(x1, df = df_best_BIC_model_interact$df_1[1])1:ns(x2, df = df_best_BIC_model_interact$df_2[1])4  0.5124138
## ns(x1, df = df_best_BIC_model_interact$df_1[1])2:ns(x2, df = df_best_BIC_model_interact$df_2[1])4  0.5077499
## ns(x1, df = df_best_BIC_model_interact$df_1[1])3:ns(x2, df = df_best_BIC_model_interact$df_2[1])4  0.5630105
## ns(x1, df = df_best_BIC_model_interact$df_1[1])4:ns(x2, df = df_best_BIC_model_interact$df_2[1])4  0.5097025
## ns(x1, df = df_best_BIC_model_interact$df_1[1])5:ns(x2, df = df_best_BIC_model_interact$df_2[1])4  0.5228773
## ns(x1, df = df_best_BIC_model_interact$df_1[1])6:ns(x2, df = df_best_BIC_model_interact$df_2[1])4  0.5142927
## ns(x1, df = df_best_BIC_model_interact$df_1[1])7:ns(x2, df = df_best_BIC_model_interact$df_2[1])4  0.4577905
## ns(x1, df = df_best_BIC_model_interact$df_1[1])8:ns(x2, df = df_best_BIC_model_interact$df_2[1])4  0.4452798
## ns(x1, df = df_best_BIC_model_interact$df_1[1])1:ns(x2, df = df_best_BIC_model_interact$df_2[1])5  0.5258397
## ns(x1, df = df_best_BIC_model_interact$df_1[1])2:ns(x2, df = df_best_BIC_model_interact$df_2[1])5  0.5208011
## ns(x1, df = df_best_BIC_model_interact$df_1[1])3:ns(x2, df = df_best_BIC_model_interact$df_2[1])5  0.5777021
## ns(x1, df = df_best_BIC_model_interact$df_1[1])4:ns(x2, df = df_best_BIC_model_interact$df_2[1])5  0.5228773
## ns(x1, df = df_best_BIC_model_interact$df_1[1])5:ns(x2, df = df_best_BIC_model_interact$df_2[1])5  0.5364497
## ns(x1, df = df_best_BIC_model_interact$df_1[1])6:ns(x2, df = df_best_BIC_model_interact$df_2[1])5  0.5278005
## ns(x1, df = df_best_BIC_model_interact$df_1[1])7:ns(x2, df = df_best_BIC_model_interact$df_2[1])5  0.4680868
## ns(x1, df = df_best_BIC_model_interact$df_1[1])8:ns(x2, df = df_best_BIC_model_interact$df_2[1])5  0.4570815
## ns(x1, df = df_best_BIC_model_interact$df_1[1])1:ns(x2, df = df_best_BIC_model_interact$df_2[1])6  0.5177074
## ns(x1, df = df_best_BIC_model_interact$df_1[1])2:ns(x2, df = df_best_BIC_model_interact$df_2[1])6  0.5120484
## ns(x1, df = df_best_BIC_model_interact$df_1[1])3:ns(x2, df = df_best_BIC_model_interact$df_2[1])6  0.5686019
## ns(x1, df = df_best_BIC_model_interact$df_1[1])4:ns(x2, df = df_best_BIC_model_interact$df_2[1])6  0.5142927
## ns(x1, df = df_best_BIC_model_interact$df_1[1])5:ns(x2, df = df_best_BIC_model_interact$df_2[1])6  0.5278005
## ns(x1, df = df_best_BIC_model_interact$df_1[1])6:ns(x2, df = df_best_BIC_model_interact$df_2[1])6  0.5197280
## ns(x1, df = df_best_BIC_model_interact$df_1[1])7:ns(x2, df = df_best_BIC_model_interact$df_2[1])6  0.4561213
## ns(x1, df = df_best_BIC_model_interact$df_1[1])8:ns(x2, df = df_best_BIC_model_interact$df_2[1])6  0.4503849
## ns(x1, df = df_best_BIC_model_interact$df_1[1])1:ns(x2, df = df_best_BIC_model_interact$df_2[1])7  0.4553383
## ns(x1, df = df_best_BIC_model_interact$df_1[1])2:ns(x2, df = df_best_BIC_model_interact$df_2[1])7  0.4579938
## ns(x1, df = df_best_BIC_model_interact$df_1[1])3:ns(x2, df = df_best_BIC_model_interact$df_2[1])7  0.5019250
## ns(x1, df = df_best_BIC_model_interact$df_1[1])4:ns(x2, df = df_best_BIC_model_interact$df_2[1])7  0.4577905
## ns(x1, df = df_best_BIC_model_interact$df_1[1])5:ns(x2, df = df_best_BIC_model_interact$df_2[1])7  0.4680868
## ns(x1, df = df_best_BIC_model_interact$df_1[1])6:ns(x2, df = df_best_BIC_model_interact$df_2[1])7  0.4561213
## ns(x1, df = df_best_BIC_model_interact$df_1[1])7:ns(x2, df = df_best_BIC_model_interact$df_2[1])7  0.4504753
## ns(x1, df = df_best_BIC_model_interact$df_1[1])8:ns(x2, df = df_best_BIC_model_interact$df_2[1])7  0.3920051
## ns(x1, df = df_best_BIC_model_interact$df_1[1])1:ns(x2, df = df_best_BIC_model_interact$df_2[1])8  0.4485735
## ns(x1, df = df_best_BIC_model_interact$df_1[1])2:ns(x2, df = df_best_BIC_model_interact$df_2[1])8  0.4432003
## ns(x1, df = df_best_BIC_model_interact$df_1[1])3:ns(x2, df = df_best_BIC_model_interact$df_2[1])8  0.4925601
## ns(x1, df = df_best_BIC_model_interact$df_1[1])4:ns(x2, df = df_best_BIC_model_interact$df_2[1])8  0.4452798
## ns(x1, df = df_best_BIC_model_interact$df_1[1])5:ns(x2, df = df_best_BIC_model_interact$df_2[1])8  0.4570815
## ns(x1, df = df_best_BIC_model_interact$df_1[1])6:ns(x2, df = df_best_BIC_model_interact$df_2[1])8  0.4503849
## ns(x1, df = df_best_BIC_model_interact$df_1[1])7:ns(x2, df = df_best_BIC_model_interact$df_2[1])8  0.3920051
## ns(x1, df = df_best_BIC_model_interact$df_1[1])8:ns(x2, df = df_best_BIC_model_interact$df_2[1])8  0.3904912
##                                                                                                   t value
## (Intercept)                                                                                         0.281
## ns(x1, df = df_best_BIC_model_interact$df_1[1])1:ns(x2, df = df_best_BIC_model_interact$df_2[1])1   7.548
## ns(x1, df = df_best_BIC_model_interact$df_1[1])2:ns(x2, df = df_best_BIC_model_interact$df_2[1])1  -0.447
## ns(x1, df = df_best_BIC_model_interact$df_1[1])3:ns(x2, df = df_best_BIC_model_interact$df_2[1])1  -4.980
## ns(x1, df = df_best_BIC_model_interact$df_1[1])4:ns(x2, df = df_best_BIC_model_interact$df_2[1])1  -0.270
## ns(x1, df = df_best_BIC_model_interact$df_1[1])5:ns(x2, df = df_best_BIC_model_interact$df_2[1])1   6.083
## ns(x1, df = df_best_BIC_model_interact$df_1[1])6:ns(x2, df = df_best_BIC_model_interact$df_2[1])1  -0.190
## ns(x1, df = df_best_BIC_model_interact$df_1[1])7:ns(x2, df = df_best_BIC_model_interact$df_2[1])1  -7.189
## ns(x1, df = df_best_BIC_model_interact$df_1[1])8:ns(x2, df = df_best_BIC_model_interact$df_2[1])1  -1.879
## ns(x1, df = df_best_BIC_model_interact$df_1[1])1:ns(x2, df = df_best_BIC_model_interact$df_2[1])2  -0.687
## ns(x1, df = df_best_BIC_model_interact$df_1[1])2:ns(x2, df = df_best_BIC_model_interact$df_2[1])2   0.262
## ns(x1, df = df_best_BIC_model_interact$df_1[1])3:ns(x2, df = df_best_BIC_model_interact$df_2[1])2  -0.124
## ns(x1, df = df_best_BIC_model_interact$df_1[1])4:ns(x2, df = df_best_BIC_model_interact$df_2[1])2   0.177
## ns(x1, df = df_best_BIC_model_interact$df_1[1])5:ns(x2, df = df_best_BIC_model_interact$df_2[1])2  -0.067
## ns(x1, df = df_best_BIC_model_interact$df_1[1])6:ns(x2, df = df_best_BIC_model_interact$df_2[1])2  -0.385
## ns(x1, df = df_best_BIC_model_interact$df_1[1])7:ns(x2, df = df_best_BIC_model_interact$df_2[1])2   0.321
## ns(x1, df = df_best_BIC_model_interact$df_1[1])8:ns(x2, df = df_best_BIC_model_interact$df_2[1])2  -0.051
## ns(x1, df = df_best_BIC_model_interact$df_1[1])1:ns(x2, df = df_best_BIC_model_interact$df_2[1])3  -5.105
## ns(x1, df = df_best_BIC_model_interact$df_1[1])2:ns(x2, df = df_best_BIC_model_interact$df_2[1])3  -0.311
## ns(x1, df = df_best_BIC_model_interact$df_1[1])3:ns(x2, df = df_best_BIC_model_interact$df_2[1])3   4.173
## ns(x1, df = df_best_BIC_model_interact$df_1[1])4:ns(x2, df = df_best_BIC_model_interact$df_2[1])3  -0.453
## ns(x1, df = df_best_BIC_model_interact$df_1[1])5:ns(x2, df = df_best_BIC_model_interact$df_2[1])3  -4.498
## ns(x1, df = df_best_BIC_model_interact$df_1[1])6:ns(x2, df = df_best_BIC_model_interact$df_2[1])3   0.500
## ns(x1, df = df_best_BIC_model_interact$df_1[1])7:ns(x2, df = df_best_BIC_model_interact$df_2[1])3   5.014
## ns(x1, df = df_best_BIC_model_interact$df_1[1])8:ns(x2, df = df_best_BIC_model_interact$df_2[1])3   1.667
## ns(x1, df = df_best_BIC_model_interact$df_1[1])1:ns(x2, df = df_best_BIC_model_interact$df_2[1])4   0.023
## ns(x1, df = df_best_BIC_model_interact$df_1[1])2:ns(x2, df = df_best_BIC_model_interact$df_2[1])4   0.315
## ns(x1, df = df_best_BIC_model_interact$df_1[1])3:ns(x2, df = df_best_BIC_model_interact$df_2[1])4  -0.626
## ns(x1, df = df_best_BIC_model_interact$df_1[1])4:ns(x2, df = df_best_BIC_model_interact$df_2[1])4   0.398
## ns(x1, df = df_best_BIC_model_interact$df_1[1])5:ns(x2, df = df_best_BIC_model_interact$df_2[1])4  -0.001
## ns(x1, df = df_best_BIC_model_interact$df_1[1])6:ns(x2, df = df_best_BIC_model_interact$df_2[1])4   0.038
## ns(x1, df = df_best_BIC_model_interact$df_1[1])7:ns(x2, df = df_best_BIC_model_interact$df_2[1])4  -0.297
## ns(x1, df = df_best_BIC_model_interact$df_1[1])8:ns(x2, df = df_best_BIC_model_interact$df_2[1])4  -0.426
## ns(x1, df = df_best_BIC_model_interact$df_1[1])1:ns(x2, df = df_best_BIC_model_interact$df_2[1])5   5.528
## ns(x1, df = df_best_BIC_model_interact$df_1[1])2:ns(x2, df = df_best_BIC_model_interact$df_2[1])5   0.532
## ns(x1, df = df_best_BIC_model_interact$df_1[1])3:ns(x2, df = df_best_BIC_model_interact$df_2[1])5  -5.127
## ns(x1, df = df_best_BIC_model_interact$df_1[1])4:ns(x2, df = df_best_BIC_model_interact$df_2[1])5   0.886
## ns(x1, df = df_best_BIC_model_interact$df_1[1])5:ns(x2, df = df_best_BIC_model_interact$df_2[1])5   4.825
## ns(x1, df = df_best_BIC_model_interact$df_1[1])6:ns(x2, df = df_best_BIC_model_interact$df_2[1])5  -0.166
## ns(x1, df = df_best_BIC_model_interact$df_1[1])7:ns(x2, df = df_best_BIC_model_interact$df_2[1])5  -5.395
## ns(x1, df = df_best_BIC_model_interact$df_1[1])8:ns(x2, df = df_best_BIC_model_interact$df_2[1])5  -1.464
## ns(x1, df = df_best_BIC_model_interact$df_1[1])1:ns(x2, df = df_best_BIC_model_interact$df_2[1])6  -0.221
## ns(x1, df = df_best_BIC_model_interact$df_1[1])2:ns(x2, df = df_best_BIC_model_interact$df_2[1])6  -0.403
## ns(x1, df = df_best_BIC_model_interact$df_1[1])3:ns(x2, df = df_best_BIC_model_interact$df_2[1])6   0.979
## ns(x1, df = df_best_BIC_model_interact$df_1[1])4:ns(x2, df = df_best_BIC_model_interact$df_2[1])6  -0.785
## ns(x1, df = df_best_BIC_model_interact$df_1[1])5:ns(x2, df = df_best_BIC_model_interact$df_2[1])6  -0.439
## ns(x1, df = df_best_BIC_model_interact$df_1[1])6:ns(x2, df = df_best_BIC_model_interact$df_2[1])6   0.176
## ns(x1, df = df_best_BIC_model_interact$df_1[1])7:ns(x2, df = df_best_BIC_model_interact$df_2[1])6  -0.104
## ns(x1, df = df_best_BIC_model_interact$df_1[1])8:ns(x2, df = df_best_BIC_model_interact$df_2[1])6   0.103
## ns(x1, df = df_best_BIC_model_interact$df_1[1])1:ns(x2, df = df_best_BIC_model_interact$df_2[1])7  -7.075
## ns(x1, df = df_best_BIC_model_interact$df_1[1])2:ns(x2, df = df_best_BIC_model_interact$df_2[1])7  -0.320
## ns(x1, df = df_best_BIC_model_interact$df_1[1])3:ns(x2, df = df_best_BIC_model_interact$df_2[1])7   5.254
## ns(x1, df = df_best_BIC_model_interact$df_1[1])4:ns(x2, df = df_best_BIC_model_interact$df_2[1])7  -0.026
## ns(x1, df = df_best_BIC_model_interact$df_1[1])5:ns(x2, df = df_best_BIC_model_interact$df_2[1])7  -5.782
## ns(x1, df = df_best_BIC_model_interact$df_1[1])6:ns(x2, df = df_best_BIC_model_interact$df_2[1])7   0.345
## ns(x1, df = df_best_BIC_model_interact$df_1[1])7:ns(x2, df = df_best_BIC_model_interact$df_2[1])7   6.168
## ns(x1, df = df_best_BIC_model_interact$df_1[1])8:ns(x2, df = df_best_BIC_model_interact$df_2[1])7   1.858
## ns(x1, df = df_best_BIC_model_interact$df_1[1])1:ns(x2, df = df_best_BIC_model_interact$df_2[1])8  -1.640
## ns(x1, df = df_best_BIC_model_interact$df_1[1])2:ns(x2, df = df_best_BIC_model_interact$df_2[1])8  -0.209
## ns(x1, df = df_best_BIC_model_interact$df_1[1])3:ns(x2, df = df_best_BIC_model_interact$df_2[1])8   1.740
## ns(x1, df = df_best_BIC_model_interact$df_1[1])4:ns(x2, df = df_best_BIC_model_interact$df_2[1])8  -0.147
## ns(x1, df = df_best_BIC_model_interact$df_1[1])5:ns(x2, df = df_best_BIC_model_interact$df_2[1])8  -1.094
## ns(x1, df = df_best_BIC_model_interact$df_1[1])6:ns(x2, df = df_best_BIC_model_interact$df_2[1])8  -0.275
## ns(x1, df = df_best_BIC_model_interact$df_1[1])7:ns(x2, df = df_best_BIC_model_interact$df_2[1])8   1.822
## ns(x1, df = df_best_BIC_model_interact$df_1[1])8:ns(x2, df = df_best_BIC_model_interact$df_2[1])8   0.787
##                                                                                                   Pr(>|t|)
## (Intercept)                                                                                         0.7787
## ns(x1, df = df_best_BIC_model_interact$df_1[1])1:ns(x2, df = df_best_BIC_model_interact$df_2[1])1 3.36e-13
## ns(x1, df = df_best_BIC_model_interact$df_1[1])2:ns(x2, df = df_best_BIC_model_interact$df_2[1])1   0.6548
## ns(x1, df = df_best_BIC_model_interact$df_1[1])3:ns(x2, df = df_best_BIC_model_interact$df_2[1])1 9.73e-07
## ns(x1, df = df_best_BIC_model_interact$df_1[1])4:ns(x2, df = df_best_BIC_model_interact$df_2[1])1   0.7873
## ns(x1, df = df_best_BIC_model_interact$df_1[1])5:ns(x2, df = df_best_BIC_model_interact$df_2[1])1 2.91e-09
## ns(x1, df = df_best_BIC_model_interact$df_1[1])6:ns(x2, df = df_best_BIC_model_interact$df_2[1])1   0.8495
## ns(x1, df = df_best_BIC_model_interact$df_1[1])7:ns(x2, df = df_best_BIC_model_interact$df_2[1])1 3.55e-12
## ns(x1, df = df_best_BIC_model_interact$df_1[1])8:ns(x2, df = df_best_BIC_model_interact$df_2[1])1   0.0611
## ns(x1, df = df_best_BIC_model_interact$df_1[1])1:ns(x2, df = df_best_BIC_model_interact$df_2[1])2   0.4922
## ns(x1, df = df_best_BIC_model_interact$df_1[1])2:ns(x2, df = df_best_BIC_model_interact$df_2[1])2   0.7934
## ns(x1, df = df_best_BIC_model_interact$df_1[1])3:ns(x2, df = df_best_BIC_model_interact$df_2[1])2   0.9011
## ns(x1, df = df_best_BIC_model_interact$df_1[1])4:ns(x2, df = df_best_BIC_model_interact$df_2[1])2   0.8598
## ns(x1, df = df_best_BIC_model_interact$df_1[1])5:ns(x2, df = df_best_BIC_model_interact$df_2[1])2   0.9465
## ns(x1, df = df_best_BIC_model_interact$df_1[1])6:ns(x2, df = df_best_BIC_model_interact$df_2[1])2   0.7004
## ns(x1, df = df_best_BIC_model_interact$df_1[1])7:ns(x2, df = df_best_BIC_model_interact$df_2[1])2   0.7486
## ns(x1, df = df_best_BIC_model_interact$df_1[1])8:ns(x2, df = df_best_BIC_model_interact$df_2[1])2   0.9596
## ns(x1, df = df_best_BIC_model_interact$df_1[1])1:ns(x2, df = df_best_BIC_model_interact$df_2[1])3 5.27e-07
## ns(x1, df = df_best_BIC_model_interact$df_1[1])2:ns(x2, df = df_best_BIC_model_interact$df_2[1])3   0.7563
## ns(x1, df = df_best_BIC_model_interact$df_1[1])3:ns(x2, df = df_best_BIC_model_interact$df_2[1])3 3.74e-05
## ns(x1, df = df_best_BIC_model_interact$df_1[1])4:ns(x2, df = df_best_BIC_model_interact$df_2[1])3   0.6507
## ns(x1, df = df_best_BIC_model_interact$df_1[1])5:ns(x2, df = df_best_BIC_model_interact$df_2[1])3 9.16e-06
## ns(x1, df = df_best_BIC_model_interact$df_1[1])6:ns(x2, df = df_best_BIC_model_interact$df_2[1])3   0.6175
## ns(x1, df = df_best_BIC_model_interact$df_1[1])7:ns(x2, df = df_best_BIC_model_interact$df_2[1])3 8.21e-07
## ns(x1, df = df_best_BIC_model_interact$df_1[1])8:ns(x2, df = df_best_BIC_model_interact$df_2[1])3   0.0964
## ns(x1, df = df_best_BIC_model_interact$df_1[1])1:ns(x2, df = df_best_BIC_model_interact$df_2[1])4   0.9817
## ns(x1, df = df_best_BIC_model_interact$df_1[1])2:ns(x2, df = df_best_BIC_model_interact$df_2[1])4   0.7532
## ns(x1, df = df_best_BIC_model_interact$df_1[1])3:ns(x2, df = df_best_BIC_model_interact$df_2[1])4   0.5318
## ns(x1, df = df_best_BIC_model_interact$df_1[1])4:ns(x2, df = df_best_BIC_model_interact$df_2[1])4   0.6911
## ns(x1, df = df_best_BIC_model_interact$df_1[1])5:ns(x2, df = df_best_BIC_model_interact$df_2[1])4   0.9994
## ns(x1, df = df_best_BIC_model_interact$df_1[1])6:ns(x2, df = df_best_BIC_model_interact$df_2[1])4   0.9696
## ns(x1, df = df_best_BIC_model_interact$df_1[1])7:ns(x2, df = df_best_BIC_model_interact$df_2[1])4   0.7666
## ns(x1, df = df_best_BIC_model_interact$df_1[1])8:ns(x2, df = df_best_BIC_model_interact$df_2[1])4   0.6707
## ns(x1, df = df_best_BIC_model_interact$df_1[1])1:ns(x2, df = df_best_BIC_model_interact$df_2[1])5 6.06e-08
## ns(x1, df = df_best_BIC_model_interact$df_1[1])2:ns(x2, df = df_best_BIC_model_interact$df_2[1])5   0.5953
## ns(x1, df = df_best_BIC_model_interact$df_1[1])3:ns(x2, df = df_best_BIC_model_interact$df_2[1])5 4.73e-07
## ns(x1, df = df_best_BIC_model_interact$df_1[1])4:ns(x2, df = df_best_BIC_model_interact$df_2[1])5   0.3759
## ns(x1, df = df_best_BIC_model_interact$df_1[1])5:ns(x2, df = df_best_BIC_model_interact$df_2[1])5 2.04e-06
## ns(x1, df = df_best_BIC_model_interact$df_1[1])6:ns(x2, df = df_best_BIC_model_interact$df_2[1])5   0.8682
## ns(x1, df = df_best_BIC_model_interact$df_1[1])7:ns(x2, df = df_best_BIC_model_interact$df_2[1])5 1.21e-07
## ns(x1, df = df_best_BIC_model_interact$df_1[1])8:ns(x2, df = df_best_BIC_model_interact$df_2[1])5   0.1441
## ns(x1, df = df_best_BIC_model_interact$df_1[1])1:ns(x2, df = df_best_BIC_model_interact$df_2[1])6   0.8252
## ns(x1, df = df_best_BIC_model_interact$df_1[1])2:ns(x2, df = df_best_BIC_model_interact$df_2[1])6   0.6870
## ns(x1, df = df_best_BIC_model_interact$df_1[1])3:ns(x2, df = df_best_BIC_model_interact$df_2[1])6   0.3281
## ns(x1, df = df_best_BIC_model_interact$df_1[1])4:ns(x2, df = df_best_BIC_model_interact$df_2[1])6   0.4331
## ns(x1, df = df_best_BIC_model_interact$df_1[1])5:ns(x2, df = df_best_BIC_model_interact$df_2[1])6   0.6607
## ns(x1, df = df_best_BIC_model_interact$df_1[1])6:ns(x2, df = df_best_BIC_model_interact$df_2[1])6   0.8606
## ns(x1, df = df_best_BIC_model_interact$df_1[1])7:ns(x2, df = df_best_BIC_model_interact$df_2[1])6   0.9170
## ns(x1, df = df_best_BIC_model_interact$df_1[1])8:ns(x2, df = df_best_BIC_model_interact$df_2[1])6   0.9179
## ns(x1, df = df_best_BIC_model_interact$df_1[1])1:ns(x2, df = df_best_BIC_model_interact$df_2[1])7 7.36e-12
## ns(x1, df = df_best_BIC_model_interact$df_1[1])2:ns(x2, df = df_best_BIC_model_interact$df_2[1])7   0.7490
## ns(x1, df = df_best_BIC_model_interact$df_1[1])3:ns(x2, df = df_best_BIC_model_interact$df_2[1])7 2.50e-07
## ns(x1, df = df_best_BIC_model_interact$df_1[1])4:ns(x2, df = df_best_BIC_model_interact$df_2[1])7   0.9791
## ns(x1, df = df_best_BIC_model_interact$df_1[1])5:ns(x2, df = df_best_BIC_model_interact$df_2[1])7 1.56e-08
## ns(x1, df = df_best_BIC_model_interact$df_1[1])6:ns(x2, df = df_best_BIC_model_interact$df_2[1])7   0.7302
## ns(x1, df = df_best_BIC_model_interact$df_1[1])7:ns(x2, df = df_best_BIC_model_interact$df_2[1])7 1.79e-09
## ns(x1, df = df_best_BIC_model_interact$df_1[1])8:ns(x2, df = df_best_BIC_model_interact$df_2[1])7   0.0639
## ns(x1, df = df_best_BIC_model_interact$df_1[1])1:ns(x2, df = df_best_BIC_model_interact$df_2[1])8   0.1019
## ns(x1, df = df_best_BIC_model_interact$df_1[1])2:ns(x2, df = df_best_BIC_model_interact$df_2[1])8   0.8349
## ns(x1, df = df_best_BIC_model_interact$df_1[1])3:ns(x2, df = df_best_BIC_model_interact$df_2[1])8   0.0827
## ns(x1, df = df_best_BIC_model_interact$df_1[1])4:ns(x2, df = df_best_BIC_model_interact$df_2[1])8   0.8834
## ns(x1, df = df_best_BIC_model_interact$df_1[1])5:ns(x2, df = df_best_BIC_model_interact$df_2[1])8   0.2748
## ns(x1, df = df_best_BIC_model_interact$df_1[1])6:ns(x2, df = df_best_BIC_model_interact$df_2[1])8   0.7836
## ns(x1, df = df_best_BIC_model_interact$df_1[1])7:ns(x2, df = df_best_BIC_model_interact$df_2[1])8   0.0692
## ns(x1, df = df_best_BIC_model_interact$df_1[1])8:ns(x2, df = df_best_BIC_model_interact$df_2[1])8   0.4317
##                                                                                                      
## (Intercept)                                                                                          
## ns(x1, df = df_best_BIC_model_interact$df_1[1])1:ns(x2, df = df_best_BIC_model_interact$df_2[1])1 ***
## ns(x1, df = df_best_BIC_model_interact$df_1[1])2:ns(x2, df = df_best_BIC_model_interact$df_2[1])1    
## ns(x1, df = df_best_BIC_model_interact$df_1[1])3:ns(x2, df = df_best_BIC_model_interact$df_2[1])1 ***
## ns(x1, df = df_best_BIC_model_interact$df_1[1])4:ns(x2, df = df_best_BIC_model_interact$df_2[1])1    
## ns(x1, df = df_best_BIC_model_interact$df_1[1])5:ns(x2, df = df_best_BIC_model_interact$df_2[1])1 ***
## ns(x1, df = df_best_BIC_model_interact$df_1[1])6:ns(x2, df = df_best_BIC_model_interact$df_2[1])1    
## ns(x1, df = df_best_BIC_model_interact$df_1[1])7:ns(x2, df = df_best_BIC_model_interact$df_2[1])1 ***
## ns(x1, df = df_best_BIC_model_interact$df_1[1])8:ns(x2, df = df_best_BIC_model_interact$df_2[1])1 .  
## ns(x1, df = df_best_BIC_model_interact$df_1[1])1:ns(x2, df = df_best_BIC_model_interact$df_2[1])2    
## ns(x1, df = df_best_BIC_model_interact$df_1[1])2:ns(x2, df = df_best_BIC_model_interact$df_2[1])2    
## ns(x1, df = df_best_BIC_model_interact$df_1[1])3:ns(x2, df = df_best_BIC_model_interact$df_2[1])2    
## ns(x1, df = df_best_BIC_model_interact$df_1[1])4:ns(x2, df = df_best_BIC_model_interact$df_2[1])2    
## ns(x1, df = df_best_BIC_model_interact$df_1[1])5:ns(x2, df = df_best_BIC_model_interact$df_2[1])2    
## ns(x1, df = df_best_BIC_model_interact$df_1[1])6:ns(x2, df = df_best_BIC_model_interact$df_2[1])2    
## ns(x1, df = df_best_BIC_model_interact$df_1[1])7:ns(x2, df = df_best_BIC_model_interact$df_2[1])2    
## ns(x1, df = df_best_BIC_model_interact$df_1[1])8:ns(x2, df = df_best_BIC_model_interact$df_2[1])2    
## ns(x1, df = df_best_BIC_model_interact$df_1[1])1:ns(x2, df = df_best_BIC_model_interact$df_2[1])3 ***
## ns(x1, df = df_best_BIC_model_interact$df_1[1])2:ns(x2, df = df_best_BIC_model_interact$df_2[1])3    
## ns(x1, df = df_best_BIC_model_interact$df_1[1])3:ns(x2, df = df_best_BIC_model_interact$df_2[1])3 ***
## ns(x1, df = df_best_BIC_model_interact$df_1[1])4:ns(x2, df = df_best_BIC_model_interact$df_2[1])3    
## ns(x1, df = df_best_BIC_model_interact$df_1[1])5:ns(x2, df = df_best_BIC_model_interact$df_2[1])3 ***
## ns(x1, df = df_best_BIC_model_interact$df_1[1])6:ns(x2, df = df_best_BIC_model_interact$df_2[1])3    
## ns(x1, df = df_best_BIC_model_interact$df_1[1])7:ns(x2, df = df_best_BIC_model_interact$df_2[1])3 ***
## ns(x1, df = df_best_BIC_model_interact$df_1[1])8:ns(x2, df = df_best_BIC_model_interact$df_2[1])3 .  
## ns(x1, df = df_best_BIC_model_interact$df_1[1])1:ns(x2, df = df_best_BIC_model_interact$df_2[1])4    
## ns(x1, df = df_best_BIC_model_interact$df_1[1])2:ns(x2, df = df_best_BIC_model_interact$df_2[1])4    
## ns(x1, df = df_best_BIC_model_interact$df_1[1])3:ns(x2, df = df_best_BIC_model_interact$df_2[1])4    
## ns(x1, df = df_best_BIC_model_interact$df_1[1])4:ns(x2, df = df_best_BIC_model_interact$df_2[1])4    
## ns(x1, df = df_best_BIC_model_interact$df_1[1])5:ns(x2, df = df_best_BIC_model_interact$df_2[1])4    
## ns(x1, df = df_best_BIC_model_interact$df_1[1])6:ns(x2, df = df_best_BIC_model_interact$df_2[1])4    
## ns(x1, df = df_best_BIC_model_interact$df_1[1])7:ns(x2, df = df_best_BIC_model_interact$df_2[1])4    
## ns(x1, df = df_best_BIC_model_interact$df_1[1])8:ns(x2, df = df_best_BIC_model_interact$df_2[1])4    
## ns(x1, df = df_best_BIC_model_interact$df_1[1])1:ns(x2, df = df_best_BIC_model_interact$df_2[1])5 ***
## ns(x1, df = df_best_BIC_model_interact$df_1[1])2:ns(x2, df = df_best_BIC_model_interact$df_2[1])5    
## ns(x1, df = df_best_BIC_model_interact$df_1[1])3:ns(x2, df = df_best_BIC_model_interact$df_2[1])5 ***
## ns(x1, df = df_best_BIC_model_interact$df_1[1])4:ns(x2, df = df_best_BIC_model_interact$df_2[1])5    
## ns(x1, df = df_best_BIC_model_interact$df_1[1])5:ns(x2, df = df_best_BIC_model_interact$df_2[1])5 ***
## ns(x1, df = df_best_BIC_model_interact$df_1[1])6:ns(x2, df = df_best_BIC_model_interact$df_2[1])5    
## ns(x1, df = df_best_BIC_model_interact$df_1[1])7:ns(x2, df = df_best_BIC_model_interact$df_2[1])5 ***
## ns(x1, df = df_best_BIC_model_interact$df_1[1])8:ns(x2, df = df_best_BIC_model_interact$df_2[1])5    
## ns(x1, df = df_best_BIC_model_interact$df_1[1])1:ns(x2, df = df_best_BIC_model_interact$df_2[1])6    
## ns(x1, df = df_best_BIC_model_interact$df_1[1])2:ns(x2, df = df_best_BIC_model_interact$df_2[1])6    
## ns(x1, df = df_best_BIC_model_interact$df_1[1])3:ns(x2, df = df_best_BIC_model_interact$df_2[1])6    
## ns(x1, df = df_best_BIC_model_interact$df_1[1])4:ns(x2, df = df_best_BIC_model_interact$df_2[1])6    
## ns(x1, df = df_best_BIC_model_interact$df_1[1])5:ns(x2, df = df_best_BIC_model_interact$df_2[1])6    
## ns(x1, df = df_best_BIC_model_interact$df_1[1])6:ns(x2, df = df_best_BIC_model_interact$df_2[1])6    
## ns(x1, df = df_best_BIC_model_interact$df_1[1])7:ns(x2, df = df_best_BIC_model_interact$df_2[1])6    
## ns(x1, df = df_best_BIC_model_interact$df_1[1])8:ns(x2, df = df_best_BIC_model_interact$df_2[1])6    
## ns(x1, df = df_best_BIC_model_interact$df_1[1])1:ns(x2, df = df_best_BIC_model_interact$df_2[1])7 ***
## ns(x1, df = df_best_BIC_model_interact$df_1[1])2:ns(x2, df = df_best_BIC_model_interact$df_2[1])7    
## ns(x1, df = df_best_BIC_model_interact$df_1[1])3:ns(x2, df = df_best_BIC_model_interact$df_2[1])7 ***
## ns(x1, df = df_best_BIC_model_interact$df_1[1])4:ns(x2, df = df_best_BIC_model_interact$df_2[1])7    
## ns(x1, df = df_best_BIC_model_interact$df_1[1])5:ns(x2, df = df_best_BIC_model_interact$df_2[1])7 ***
## ns(x1, df = df_best_BIC_model_interact$df_1[1])6:ns(x2, df = df_best_BIC_model_interact$df_2[1])7    
## ns(x1, df = df_best_BIC_model_interact$df_1[1])7:ns(x2, df = df_best_BIC_model_interact$df_2[1])7 ***
## ns(x1, df = df_best_BIC_model_interact$df_1[1])8:ns(x2, df = df_best_BIC_model_interact$df_2[1])7 .  
## ns(x1, df = df_best_BIC_model_interact$df_1[1])1:ns(x2, df = df_best_BIC_model_interact$df_2[1])8    
## ns(x1, df = df_best_BIC_model_interact$df_1[1])2:ns(x2, df = df_best_BIC_model_interact$df_2[1])8    
## ns(x1, df = df_best_BIC_model_interact$df_1[1])3:ns(x2, df = df_best_BIC_model_interact$df_2[1])8 .  
## ns(x1, df = df_best_BIC_model_interact$df_1[1])4:ns(x2, df = df_best_BIC_model_interact$df_2[1])8    
## ns(x1, df = df_best_BIC_model_interact$df_1[1])5:ns(x2, df = df_best_BIC_model_interact$df_2[1])8    
## ns(x1, df = df_best_BIC_model_interact$df_1[1])6:ns(x2, df = df_best_BIC_model_interact$df_2[1])8    
## ns(x1, df = df_best_BIC_model_interact$df_1[1])7:ns(x2, df = df_best_BIC_model_interact$df_2[1])8 .  
## ns(x1, df = df_best_BIC_model_interact$df_1[1])8:ns(x2, df = df_best_BIC_model_interact$df_2[1])8    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2852 on 376 degrees of freedom
## Multiple R-squared:  0.7602, Adjusted R-squared:  0.7193 
## F-statistic: 18.62 on 64 and 376 DF,  p-value: < 2.2e-16
coefplot::coefplot(best_BIC_fit_interact) + theme_bw()

### interaction effects on the coarse grid
model.matrix( ~ ns(x1, df = df_best_BIC_model_interact$df_1[1]):ns(x2, df=df_best_BIC_model_interact$df_2[1]), train_df)  %>% 
  as.data.frame() %>% tibble::as_tibble() %>% 
  select(-`(Intercept)`) %>% 
  tibble::rowid_to_column() %>% 
  left_join(coarse_grid %>% tibble::rowid_to_column(),
            by = "rowid") %>% 
  tidyr::gather(key = "key", value = "value", -rowid, -x1, -x2) %>% 
  tidyr::separate(key,
                  c("left_word", "right_word"),
                  sep = ":",
                  fill = "right",
                  remove = FALSE) %>% 
  filter(!is.na(right_word)) %>% 
  tidyr::separate(left_word,
                  c("ns_x1_word", "x1_s_id"),
                  sep = "\\)",
                  remove = FALSE) %>% 
  tidyr::separate(right_word,
                  c("ns_x2_word", "x2_s_id"),
                  sep = "\\)",
                  remove = FALSE) %>% 
  ggplot(mapping = aes(x = x1, y = x2)) +
  geom_raster(mapping = aes(fill = value)) +
  facet_grid(x1_s_id ~ x2_s_id, labeller = "label_both") +
  scale_fill_viridis_b() +
  theme_bw()